В каком потоке работает обратный вызов? - PullRequest
2 голосов
/ 25 октября 2011

Я написал небольшое приложение, которое вызывает асинхронный метод, используя 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 Ответ

2 голосов
/ 25 октября 2011

С MSDN :

Выполнение метода обратного вызова при завершении асинхронного вызова

[...] Метод обратного вызовавыполняется в потоке ThreadPool.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...