C#中的调用目标引发了异常

本文关键字:异常 目标 调用 | 更新日期: 2023-09-27 18:20:48

我正在使用BackGround Worker从数据库加载数据(MS Access)。在我的Form_Load中,我使用:

 bgw.RunWorkerAsync();

在我的DoWork事件中,我从DB 中提取了数据

private void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        int iResult = OpenDB();
        if (iResult != 0)
        {
            MessageBox.Show("Error in Opening DataBase", Constants.TITLE);
            return ;
        }
        DataSet ds = GetAllUserInfo();
        e.Result = ds;

    }

在我的RunWorkerCompleted中,我将数据分配给DataGridView。

    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        dgUsers.Rows[0].Cells[0].Value = e.Result; 

    }

//执行以上代码后出现错误

[STAThread]
        static void Main()
        {
            Application.Run(new frmMain());
        }

感谢您的帮助。谢谢

C#中的调用目标引发了异常

当另一个线程发生异常时,就会发生这种情况。

检查异常内部异常以查找DoWork方法引发的真正异常。。

使用SyncronizationContext机制进行UI更新。此处为示例http://www.codeproject.com/KB/threads/SynchronizationContext.aspx

1.将其作为全局对象:

System.Threading.SynchronizationContext synchronizationContext;
  1. 实例化Form_Load事件上的对象"synchronizationContext":

    synchronizationContext=System.Threading.synchronizationContext.Current;

  2. 将bgw_RonWorkerCompleted修改为:

    private void bgw_RunWorkerCompleted(对象发件人,RunWorkerCompletedEventArgs e){

          synchronizationContext.Post(new SendOrPostCallback(
           delegate
           {
               dgUsers.DatSource =e.Result as DataSet;
           }), null);
    

    }

您不应该在bgw_DoWork中处理异常。

 private void bgw_DoWork(object sender, DoWorkEventArgs e)
 {
            OpenDB();
            e.Result = GetAllUserInfo();
 }

相反,您必须在UI线程上检查RunWorkerCompletedEventArgs的错误属性。

 private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
     if (e.Error ==null)
        dgUsers.Rows[0].Cells[0].Value = e.Result; 
     else
       MessageBox.Show("Error in Opening DataBase", Constants.TITLE);
 }

您可能有一个跨线程操作:RunWorkerCompleted没有在UI线程中引发,导致对.Value进行跨线程操作。你能试试这个吗:

                    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
                {
                    if (this.InvokeRequired)
                    {
                        this.Invoke(bgw_RunWorkerCompleted, sender, e);
                        return;
                    }
                    dgUsers.Rows[0].Cells[0].Value = e.Result; 
                }