回调运行在哪个线程?

时间:2011-10-25 16:27:23

标签: c# asynchronous

我编写了一个使用BeginInvoke调用异步方法的小应用程序。

// Asynchronous delegate
Func<int, MailItemResult> method = SendMail;

// Select some records from the database to populate col

while (i < col.Count)
{
    method.BeginInvoke(i, SendMailCompleted, method);
    i++;
}

Console.ReadLine();

这是在控制台应用程序的Main()方法中。 MailItemResult定义为:

class MailItemResult
{
    public int CollectionIndex { get; set; }
    public bool Success { get; set; }
    public DateTime DateUpdated { get; set; }
}

美好而简单。回调方法定义如下:

static void SendMailCompleted(IAsyncResult result)
{
    var target = (Func<int, MailItemResult>)result.AsyncState;
    MailItemResult mir = target.EndInvoke(result);
    if (mir.Success)
    {
        // Update the record in the database
    }
}

此应用程序针对前100个线程运行,然后在数据库中引发死锁。现在,我理解死锁,但是我在这个小应用程序中无法理解的是哪个线程是被调用的回调方法(SendMailCompleted)?这是从主应用程序线程调用的吗?或者它是否使用BeginInvoke方法正在使用的线程池中的相同线程?

1 个答案:

答案 0 :(得分:2)

来自MSDN

  

异步调用完成时执行回调方法

     

[...]回调方法在ThreadPool线程上执行。