使用线程池和func对象

问题描述:

当使用线程池及其queuecallbackitem时,我不能传入func对象(来自方法参数)吗?使用线程池和func对象

我没有看到一个函数需要一个参数,但什么都不返回。有func<T, TResult>,但我怎么能设置TResult为空(想指出“这个方法返回void”)?

另外,我怎么能使用线程池的方法返回并采取各种paremeters?我能否将Func对象存储在泛型集合中,并且还需要一个int来指示优先级,然后执行这些funcs?

最后,在一个静态对象(如集合)中,它需要什么同步在全局应用程序中?

唯一的Func<...>/Action<...>WaitCallback类似的代表是Action<object>。它不会直接使用;但是,您可以将代表包装在eachother中:

 Action<object> func = // TODO 
     ThreadPool.QueueUserWorkItem(state=>func(state)); 

要返回结果,一个选项是更新外部状态。 Lambda表达式/匿名的方法有利于这一点,因为他们提供封闭支持:

 Func<int, int> func = x => x * 5; 
     int query = 4, result = 0; 
     ThreadPool.QueueUserWorkItem(state=> { 
      result = func(query); 
     }); 

执行后,result(从上面的上下文中)将被更新。但是,回调更常见:

 Func<int, int> func = x => x * 5; 
     int query = 4; 
     Action<int> callback = x => 
     { 
      Console.WriteLine(x); 
     }; 
     ThreadPool.QueueUserWorkItem(state=> { 
      int result = func(query); 
      callback(result); 
     }); 

其中回调函数对结果有用处。

希望这也说明了如何在线程池线程中执行任意函数。

重新同步;您处于辅助线程中,因此如果与任何共享状态交谈,您绝对需要同步。但是,您可以选择使用UI来同步结果(如果适用) - 即(来自winform):

ThreadPool.QueueUserWorkItem(state => { 
    // now on worker thread 
    int result = ... // TODO 

    this.Invoke((Action)delegate { 
     // now on UI thread 
     this.Text = result.ToString(); 
    }); 

});