2013-12-15 76 views
0
WORKER CLASS1: 

public override void Process(Crawler crawler, PropertyBag propertyBag) 
      { 
       SynchronizationContext uiContext = SynchronizationContext.Current; 
       Thread thread = new Thread(ThreadFunc); 
      } 

      void ThreadFunc(object state) 
      { 
       var syncContext = state as SynchronizationContext; 
       syncContext.Send(new Action(() => { 
        using (GeckoBrowserForm geckoBrowserForm = new GeckoBrowserForm ("http//www.google.com")) 
        { 
         geckoBrowserForm.ShowDialog(); 

         while (!geckoBrowserForm.Done) 
         { 
          Application.DoEvents(); 
         } 

         other code 
        } 
       }), null); 
      } 

但我總是得到參數「System.Action」是不能分配給參數類型「System.Threading.SendOrPostCallback」

「參數‘System.Action’是不能分配給參數類型 「 System.Threading.SendOrPostCallback'」

我想,每一個Process都會有自己的SynchronizationContext,然後用一些邏輯執行UIS主題。

UI THREAD CLASS2: 

protected override void OnLoad(EventArgs e) 
{ 
    ... 
    String val = "Some value"; 
    Done = true; 
    and return back `val` to the `CLASS1` 
} 

這是可能的嗎?

回答

1

MSDN

public virtual void Send(SendOrPostCallback d, Object state) 

public delegate void SendOrPostCallback(Object state) 

顯然,Send方法接受具有object參數和void返回值的委託。您正在傳遞一個沒有參數的委託。嘗試

syncContext.Send(new Action(o => { ... 
1

SendOrPostCallback()lambda需要接受一個對象類型的參數。見the MSDN page

試着改變你的電話本(注意拉姆達從()改爲(o)):

syncContext.Send(new Action((o) => { 
    using (GeckoBrowserForm geckoBrowserForm = new GeckoBrowserForm ("http//www.google.com")) 
     { 
      geckoBrowserForm.ShowDialog(); 

      while (!geckoBrowserForm.Done) 
      { 
       Application.DoEvents(); 
      } 
      // other code 
     } 
    }), null); 
相關問題