2009-06-30 75 views
3

我需要實現線程來提高緊湊框架應用程序中的加載時間。我想引發後臺線程來對外部API進行一些調用,而主線程緩存一些表單。當後臺線程完成後,我需要再關閉兩個線程來填充數據緩存。緊湊框架上線程的AsyncCallback

我需要後臺線程才能執行回調方法,所以我知道它已經完成,接下來的兩個線程可以啓動,但緊湊框架中不支持代理上的BeginInvoke方法,那麼還有什麼可以我這樣做?

回答

3

您可以自己安排它,只要確保您的線程方法在完成時調用完成的方法(或事件)即可。

既然CF不支持ParameterizedThreadStart,我曾經做過一個小助手類。

以下是摘錄,並沒有重新測試:

//untested 
public abstract class BgHelper 
{ 
    public System.Exception Error { get; private set; } 
    public System.Object State { get; private set; } 

    public void RunMe(object state) 
    { 
     this.State = state; 
     this.Error = null; 

     ThreadStart starter = new ThreadStart(Run); 
     Thread t = new Thread(starter); 
     t.Start();    
    } 

    private void Run() 
    { 
     try 
     { 
      DoWork();     
     } 
     catch (Exception ex) 
     { 
      Error = ex; 
     } 
     Completed(); // should check Error first 
    } 

    protected abstract void DoWork() ; 

    protected abstract void Completed(); 
} 

您需要繼承和實施的DoWork和完成。對於State屬性使用T> <可能是有意義的,只是注意到了這一點。

+0

這可以嗎?我不是線程專家,但是我擔心從線程中產生新線程,而這肯定會發生在這裏? – Charlie 2009-06-30 12:19:37

+1

是的,但沒有什麼特別的關於開始線程形式的線程。你的主線程也是一個線程。 – 2009-06-30 12:22:39

1

我知道這是一個老問題,但如果你使用CF 3.5這將是一個很好的解決問題的簡短方法。使用拉姆達代表..

ThreadStart starter =() => DoWorkMethodWithParams(param1, param2); 
Thread myNewThread = new Thread(starter){IsBackground = true}; 
myNewThread.Start();