Может ли результат async operation быть возвращен в инициированную им нить (то есть AsyncCallback
, вызванной в исходной теме)?Возврат результата операции async к исходной теме
Вот пример
void Main(string[] args)
{
Func<bool> action =() =>
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Running");
return true;
};
AsyncCallback onComplete = (r) =>
{
bool result = action.EndInvoke(r);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Completed");
};
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Main");
IAsyncResult iar = action.BeginInvoke(onComplete, null);
}
Его выход что-то вроде:
5: Main
6: Running
6: Completed
То, что я хотел бы достичь является onComplete
обратного вызова выполняется в главном потоке (например Заполненная и Main будет. имеют тот же самый идентификатор резьбы, напечатанный в этом примере)
(Я знаю, это может быть достигнуто с помощью BackgroundWorker
, т. е. этоВ исходной цепочке запускается событие 10, поэтому возвращаемое значение функции, вызванной в фоновом потоке, может быть возвращено в исходную нить)
Так почему бы не просто использовать BackgroundWorker? Он не запечатан, поэтому вы можете даже извлечь из него свою магию. – Nebula
Изначально вы можете отправить ссылку на основной поток вместе с вашей задачей, а перекрестный поток - на него. Но проверить это и убедиться, что он всегда работает? Brrr ... – Nebula
@ Небула доступ к 'Thread' не позволяет вам нажимать * работать * на поток; для этого вам нужен какой-то механизм очереди работы. –