2012-03-05 64 views
1

我在C#应用程序中创建BackgroundWorker。在DoWork内部,很少有Web服务被调用。一切正常,但只要DoWork过程完成,该应用程序就无法响应。此外,我不更新BackgroundWorker中的任何UI组件。.Net BackgroundWorker无响应

这里是代码正在DoWork

private void bwNQUpdate_DoWork(object sender, DoWorkEventArgs e) 
{ 
    int nStatusCode = 0; 

    QDetails[] pQDetails = null; 
    string queueName = "test_queue"; 

    int nQLength = cMezeoFileCloud.NQGetLength(ServiceUrl, queueName, ref nStatusCode); 
    if (nQLength > 0) 
     pQDetails = cFileCloud.GetData(ServiceUrl, queueName, nQLength, ref nStatusCode); 

    if (pQDetails != null) 
    {   
     for (int n = 0; n < pQDetails[0].nTotalQ; n++) 
     {    
      UpdateFromNQ(pNQDetails[n]); 
      cFileCloud.QValue(ServiceUrl , queueName, 1, ref nStatusCode); 
     } 
    }  
} 

而上RunWorkerCompleted

private void bwNQUpdate_RunWorkerCompleted(object sender, ProgressChangedEventArgs e) 
{ 
     MessageBox.Show("Download completed."); 
} 

RunWorkerCompleted执行之后,应用程序没有响应执行。

+2

发布您的代码!如果没有它,很难感觉到会出现什么问题! – MoonKnight 2012-03-05 11:12:18

+0

WPF或表单应用程序? – ebattulga 2012-03-05 11:12:50

+0

发生这种情况时,主线程上执行的代码是什么? – svick 2012-03-05 11:23:02

回答

1

首先,检查MessageBox.Show("Download completed.");是否使用断点调用。

如果它确实被调用,请尝试调用消息框调用,而不是直接调用它。基本上,从后台工作人员发起的任何事件都可能来自其隐藏的线程。

0

RunWorkerCompleted你已经写得很好。 RunWorkerCompleted事件由调用线程处理,而不是工作线程处理。 即使您从后台线程执行MessageBox.Show,也不会有问题,因为线程将创建它自己的Uicomponent。

我怀疑的问题在您的DoWork中。