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