是否可以将Action委托传递给ThreadPool.QueueUserWorkItem?

时间:2015-07-29 16:31:32

标签: c# asp.net

我有以下(简化)代码:

preg_replace('/\[caption\b.*?\]©.*?\[\/caption\]/su',"",$string);

我的问题是,在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 } 中,我可以将名为Method的Action参数传递给ProcessEmail方法吗?

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:3)

不,但你可以这样做:

ThreadPool.QueueUserWorkItem(new WaitCallback(state=>{Method();}));

或更简洁:

ThreadPool.QueueUserWorkItem(state=>{Method();});

基本上,您提供了一个新的匿名函数回调,可以调用您的Method()回调。

答案 1 :(得分:0)

我更喜欢这种技巧:

    ThreadPool.QueueUserWorkItem(nameOfAnonymousMethod =>
    {
        Method(...);
    });

答案 2 :(得分:0)

我认为您需要使用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);
    }
}