是否可以将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方法吗?

非常感谢。

是否可以将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);
    }
}