Вы можете использовать Task.Yield
, если хотите присоединить асинхронный обработчик, который будет вызываться после того, как были вызваны все синхронные обработчики одного и того же события, и вы также хотите, чтобы асинхронный вызов происходил на текущий контекст синхронизации. Для приложения GUI это означает, что вы хотите, чтобы обработчик запускался в потоке пользовательского интерфейса.
client.Message += async (sender, e) =>
{
await Task.Yield();
logger.Info("Some info {0}", e.Message);
}
Не используйте await Task.Run(() => { })
, потому что это просто многословный, идиоматический c, менее эффективный и (возможно) менее надежная альтернатива await Task.Yield()
.
Если вы хотите присоединить асинхронный обработчик, который будет работать в потоке ThreadPool
(вместо текущего контекста синхронизации), используйте Task.Run
:
client.Message += async (sender, e) =>
{
await Task.Run(() => logger.Info("Some info {0}", e.Message));
}
Это следует делать только в том случае, если вы уверены, что объект logger
является потокобезопасным, поддерживает параллельные операции и не требует привязки к потокам (как многие COM компоненты делать).