唯一类似于WaitCallback 的Func<...>/Action<...> 委托是Action<object>。它不能直接使用;但是,您可以将委托包装在彼此内部:
Action<object> func = // TODO
ThreadPool.QueueUserWorkItem(state=>func(state));
要返回结果,一种选择是更新外部状态。 Lambdas / anon-methods 对此很有用,因为它们提供闭包支持:
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();
});
});