是否可以将Action委托传递给ThreadPool.QueueUserWorkItem
本文关键字:ThreadPool QueueUserWorkItem Action 是否 | 更新日期: 2023-09-27 18:05:36
我有以下(简化)代码:
MailMessage message = GetMailMessage();
ProcessEmail(() => SendEmail(message));
private void ProcessEmail(Action Method) {
try {
ThreadPool.QueueUserWorkItem(new WaitCallback(?));
} catch (Exception ex) {
}
}
private static void SendEmail(object message) {
// send email
}
我的问题是,在ProcessEmail
中,我可以将名为Method的Action参数传递给ThreadPool.QueueUserWorkItem
方法吗?
非常感谢。
不,但是你可以这样做:
ThreadPool.QueueUserWorkItem(new WaitCallback(state=>{Method();}));
或者更简洁地说:
ThreadPool.QueueUserWorkItem(state=>{Method();});
本质上,您提供了一个新的匿名函数回调,使其适应Method()
回调的调用。
我更喜欢这种技术:
ThreadPool.QueueUserWorkItem(nameOfAnonymousMethod =>
{
Method(...);
});
我认为你需要使用autoresetevent或manualresetevent。
简单代码:public class Test
{
private AutoResetEvent _eventWaitThread = new AutoResetEvent(false);
private void Job()
{
Action act = () =>
{
try
{
// do work...
}
finally
{
_eventWaitThread.Set();
}
};
ThreadPool.QueueUserWorkItem(x => act());
_eventWaitThread.WaitOne(10 * 1000 * 60);
}
}