从线程启动时模态弹出窗口失败 - CSharp WPF

发布于 2024-11-09 10:36:42 字数 382 浏览 0 评论 0原文

为了批量上传许多文件,我有一段 CSharp WPF 代码,它会生成线程以允许并行上传文件。 如果上传发生错误,将使用 MessageBox 弹出一条消息。这很好用。

但最近我们决定自定义 MessageBox 的外观。我发现当使用 ShowDialog() 打开新的自定义 WPF MessageBox 窗口时,会引发错误,指出无法启动 GUI。仅当生成的线程中的代码尝试打开自定义消息窗口时才会发生这种情况 - 当从主线程打开自定义消息框时,我没有看到问题。

我的临时修复是捕获启动自定义对话框时发生的任何错误,并选择调用标准 MessageBox.Show() 来显示消息。那行得通。

我不确定为什么可以使用标准 MessageBox.Show() 但它不适用于自定义窗口。有办法解决这个问题吗?

To batch upload many files, there is one section of CSharp WPF code that I have which spawns threads to allow parallel uploading of files.
If an error occurs with the upload, a message would be popped up using MessageBox. This works fine.

But now recently we've decided to customize the look of the MessageBox. I find when our new custom WPF MessageBox window is opened with ShowDialog() that an error is thrown saying that it isn't possible to launch a GUI. This only happens when code from the spawned thread attempts to open the custom Message window -- I don't see the problem when a custom MessageBox opens from the main thread.

My temporary fix is to catch any errors that occur when the custom dialog is launched and to alternatively call the standard MessageBox.Show() to display the message. That works.

I'm not sure why it's OK to use the standard MessageBox.Show() but it isn't for the custom window. Is there a way to get around this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

海的爱人是光 2024-11-16 10:36:42

通常(在任何 GUI-API 中)不要从工作线程调用 GUI 函数,也不在 GUI 线程上做繁重的工作。
标准 MessageBox 在工作线程上工作这一事实令人遗憾。

是的,你完全正确。当您的工作线程上发生需要向用户显示的事情时,将通知(信号、事件,无论您的框架如何调用它)发送到 GUI 线程并在那里显示消息。

Generally (in any GUI-API) don't call GUI functions from worker threads and don't do heavy work on GUI threads.
The fact that the standard MessageBox works on a worker thread is sad.

Yes, you are completely right. When on your worker thread somethings happens that needs to be displayed to the user, send a notification (signal, event, whatever your Framework calls it) to the GUI thread and display the message there.

不知在何时 2024-11-16 10:36:42
protected void chkAll_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox chall = (CheckBox)sender;
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox chSelect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if (chSelect != null)
            {
                chSelect.Checked = chall.Checked;
            }
        }
    }
    protected void chkSelect_CheckedChange(object sender, EventArgs e)
    {
        int i=0;
        CheckBox chkAll = (CheckBox)GridView1.HeaderRow.FindControl("chkAll");
        for ( i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox chkSelect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if(chkSelect!=null && !chkSelect.Checked  )
                if (chkAll != null)
                {
                    chkAll.Checked = false;
                }
            break;
        }
        if (GridView1.Rows.Count == i && chkAll != null)
        {
            chkAll.Checked = true;
        }

    }
    protected void ddlPaymentMode_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddlpaymode = (DropDownList)sender;
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            Label lblpaymode = (Label)GridView1.Rows[i].FindControl("lblPayAmt_Mode");
            CheckBox chpaymode = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if (chpaymode.Checked)
            {
                lblpaymode.Text = ddlpaymode.SelectedItem.Text;
            }
        }
    }
    protected void ddlBankName_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddlBank = (DropDownList)sender;
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox cselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            Label lblBankName = (Label)GridView1.Rows[i].FindControl("LblBank");
            if (cselect.Checked)
            {
                lblBankName.Text = ddlBank.SelectedItem.Text;
            }

        }
    }
    protected void btnaddbpc_Click(object sender, EventArgs e)
    {
        int temp = Convert.ToInt32(txtChequeNo.Text);
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            Label lblcheckno = (Label)GridView1.Rows[i].FindControl("LblCheque");


            if (chkselect.Checked)
            {

                lblcheckno.Text = Convert.ToString(temp);
                temp++; 
            }

        }
    }
    protected void dtnDelete_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            Label lblcheckno = (Label)GridView1.Rows[i].FindControl("LblCheque");


            if (chkselect.Checked)
            {
                lblcheckno.Text = "";
            }

        }
    }
    protected void btnAddCDate_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            Label lblchqdate = (Label)GridView1.Rows[i].FindControl("LblCheque_Date");
            CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if (chkselect.Checked)
            {
                lblchqdate.Text = TxtChequeDate.Text;
            }
        }
    }
    protected void btnRemovecDate_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            Label lblchqdate = (Label)GridView1.Rows[i].FindControl("LblCheque_Date");
            CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if (chkselect.Checked)
            {
                lblchqdate.Text = "";
            }
        }
    }
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Modify")
        {
            string ID = e.CommandArgument.ToString();
            //Response.Redirect("Admin_Update_BinryPayment.aspx?id="+ID+"&FromDate='"+ txtfromdate.Text +"'&ToDate='"+txttilldate.Text+"'");
            int Index = ((GridViewRow)((LinkButton)e.CommandSource).Parent.Parent).RowIndex;
            CheckBox chksec = (CheckBox)GridView1.Rows[Index].FindControl("ChkSelect");
            Label lblANo = (Label)GridView1.Rows[Index].FindControl("Label2");
            Label lbAName = (Label)GridView1.Rows[Index].FindControl("Label3");
            Label lbACName = (Label)GridView1.Rows[Index].FindControl("Label3");
            Label lbacNo = (Label)GridView1.Rows[Index].FindControl("lblBankAccountNo");
            Label lbBankName = (Label)GridView1.Rows[Index].FindControl("LblBank");
            Label lbchqNo = (Label)GridView1.Rows[Index].FindControl("LblCheque");
            Label lbchqDate = (Label)GridView1.Rows[Index].FindControl("LblCheque_Date");
            Label lblChqAmt = (Label)GridView1.Rows[Index].FindControl("Label23");
            if (chksec.Checked)
            {
                txtABNo.Text = GridView1.Rows[Index].Cells[3].Text;
protected void chkAll_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox chall = (CheckBox)sender;
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox chSelect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if (chSelect != null)
            {
                chSelect.Checked = chall.Checked;
            }
        }
    }
    protected void chkSelect_CheckedChange(object sender, EventArgs e)
    {
        int i=0;
        CheckBox chkAll = (CheckBox)GridView1.HeaderRow.FindControl("chkAll");
        for ( i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox chkSelect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if(chkSelect!=null && !chkSelect.Checked  )
                if (chkAll != null)
                {
                    chkAll.Checked = false;
                }
            break;
        }
        if (GridView1.Rows.Count == i && chkAll != null)
        {
            chkAll.Checked = true;
        }

    }
    protected void ddlPaymentMode_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddlpaymode = (DropDownList)sender;
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            Label lblpaymode = (Label)GridView1.Rows[i].FindControl("lblPayAmt_Mode");
            CheckBox chpaymode = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if (chpaymode.Checked)
            {
                lblpaymode.Text = ddlpaymode.SelectedItem.Text;
            }
        }
    }
    protected void ddlBankName_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddlBank = (DropDownList)sender;
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox cselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            Label lblBankName = (Label)GridView1.Rows[i].FindControl("LblBank");
            if (cselect.Checked)
            {
                lblBankName.Text = ddlBank.SelectedItem.Text;
            }

        }
    }
    protected void btnaddbpc_Click(object sender, EventArgs e)
    {
        int temp = Convert.ToInt32(txtChequeNo.Text);
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            Label lblcheckno = (Label)GridView1.Rows[i].FindControl("LblCheque");


            if (chkselect.Checked)
            {

                lblcheckno.Text = Convert.ToString(temp);
                temp++; 
            }

        }
    }
    protected void dtnDelete_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            Label lblcheckno = (Label)GridView1.Rows[i].FindControl("LblCheque");


            if (chkselect.Checked)
            {
                lblcheckno.Text = "";
            }

        }
    }
    protected void btnAddCDate_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            Label lblchqdate = (Label)GridView1.Rows[i].FindControl("LblCheque_Date");
            CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if (chkselect.Checked)
            {
                lblchqdate.Text = TxtChequeDate.Text;
            }
        }
    }
    protected void btnRemovecDate_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            Label lblchqdate = (Label)GridView1.Rows[i].FindControl("LblCheque_Date");
            CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect");
            if (chkselect.Checked)
            {
                lblchqdate.Text = "";
            }
        }
    }
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Modify")
        {
            string ID = e.CommandArgument.ToString();
            //Response.Redirect("Admin_Update_BinryPayment.aspx?id="+ID+"&FromDate='"+ txtfromdate.Text +"'&ToDate='"+txttilldate.Text+"'");
            int Index = ((GridViewRow)((LinkButton)e.CommandSource).Parent.Parent).RowIndex;
            CheckBox chksec = (CheckBox)GridView1.Rows[Index].FindControl("ChkSelect");
            Label lblANo = (Label)GridView1.Rows[Index].FindControl("Label2");
            Label lbAName = (Label)GridView1.Rows[Index].FindControl("Label3");
            Label lbACName = (Label)GridView1.Rows[Index].FindControl("Label3");
            Label lbacNo = (Label)GridView1.Rows[Index].FindControl("lblBankAccountNo");
            Label lbBankName = (Label)GridView1.Rows[Index].FindControl("LblBank");
            Label lbchqNo = (Label)GridView1.Rows[Index].FindControl("LblCheque");
            Label lbchqDate = (Label)GridView1.Rows[Index].FindControl("LblCheque_Date");
            Label lblChqAmt = (Label)GridView1.Rows[Index].FindControl("Label23");
            if (chksec.Checked)
            {
                txtABNo.Text = GridView1.Rows[Index].Cells[3].Text;
北城挽邺 2024-11-16 10:36:42
        Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate {
            // show your MB here
        }, null);
        Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate {
            // show your MB here
        }, null);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文