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());
}
感谢您的帮助。谢谢
当另一个线程发生异常时,就会发生这种情况。
检查异常内部异常以查找DoWork
方法引发的真正异常。。
使用SyncronizationContext机制进行UI更新。此处为示例http://www.codeproject.com/KB/threads/SynchronizationContext.aspx
1.将其作为全局对象:
System.Threading.SynchronizationContext synchronizationContext;
实例化Form_Load事件上的对象"synchronizationContext":
synchronizationContext=System.Threading.synchronizationContext.Current;
将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;
}