2015-04-21 148 views
-2

我在使用多線程時遇到了一個有趣的時刻。 我有兩個線程。在主線程中,我創建佈局並添加到它的控制中,在第二個線程中,我創建另一個控件並添加到相同的佈局。它工作正常,但第二個線程稍長一點,然後主要。所以主要應該等待第二個線程。我用這個AutoResetEvent並得到了DeadLock。下面我介紹的代碼我用:帶鎖的死鎖工作

private static AutoResetEvent resetEvent = new AutoResetEvent(false); 
    private BackgroundWorker backgroundAdvancedViewWorker = new BackgroundWorker(); 
    private delegate void ShowViewDelegate(); 

    public void Run() 
    { 
     MainGeneralReportForm mainForm = ObjectFactory.GetOrCreateView<IMainGeneralReportForm>(); 
     backgroundSimpleViewWorker.RunWorkerAsync(_mainForm); 
     GeneralReportFormatView formatView = 
         ObjectFactory.ShowView<IGeneralReportFormatView>() 
     resetEvent.WaitOne(); 
     DoSomething(advancedSearchView); 
    } 

    private void backgroundAdvancedViewWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     MainGeneralReportForm mainForm = e.Argument as MainGeneralReportForm; 

     if (mainForm!= null && mainForm.InvokeRequired) 
     { 
      mainForm.BeginInvoke(new ShowViewDelegate(() => 
      { 
       advancedSearchView = 
        ObjectFactory.ShowView<IGeneralReportAdvancedSearchView>();     
       resetEvent.Set(); 
      })); 
      } 
     } 
    } 

如果主線程不等待第二個線程,應用程序引發NullReferenceException。 該問題是否存在任何解決方法或解決方法?

+0

[Thread.Join](https://msdn.microsoft.com/en-us/library/95hbf2ta%28v=vs.110%29.aspx)? –

+0

沒有幫助。一樣的問題。 –

+0

您的線程可能會產生反效果,WaitOne()最有可能阻止消息泵 – MickyD

回答

0

您通過resetEvent.WaitOne();阻止主線程,同時嘗試將工作項目安排回主線程BeginInvoke(當主線程正在等待時它確實無法運行)。

不知道什麼樣的修復會是,但在主線程上阻塞並不是真正的選擇。

也許表單上的某些「狀態」字段可能就足夠了。或者可能從BeginInvoke回撥(而不是resetEvent.Set();)運行DoSomething(advancedSearchView);

注意:如果你在4.5上,你可以考慮使用async/await而不是手動線程。