2009-06-30 83 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();