使用线程池和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();
});
});