2013-12-06 3 views
3

Я хочу отправить сообщение с использованием асинхронного вызова, но в процессе используются одноразовые ресурсы. Я не уверен, как правильно справиться с этим.Вызов асинхронного метода при использовании оператора

using(IDisposable disposeMe = new DisposableThing()) 
{ 
    MethodAsync(disposeMe); 
} 

Любые идеи, как это сделать. Асинхронный метод не имеет обратного вызова.

EDIT:

Основываясь на предположении, принятый ответ на @Servy. Реализация была изменена:

public async Task Method() 
{ 
    using(IDisposable disposeMe = new DisposableThing()) 
    { 
     await MethodAsync(disposeMe); 
    } 
} 
+1

Асинхронная операция должна взять на себя ответственность за удаление объекта. –

ответ

9

метод асинхронной не имеет обратного вызова

Ну это проблема. A очень большой проблема. Если это вообще возможно, вы должны это исправить; если нет веских оснований для этого, все асинхронные методы должны предоставить некоторым средствам для звонящего знать, когда они завершатся, является ли это обратным вызовом, возвращая Task, увольняя событие и т. д. Это особенно беспокоит асинхронное метод, который зависит от ресурса, доступного для этого.

Если у вас действительно нет способа получить уведомление, когда операция завершена, тогда вам не удастся позвонить по номеру Dispose после завершения этого метода. Единственное средство, которое вы обеспечиваете, чтобы вы не избавлялись от ресурса, в то время как асинхронная операция по-прежнему нуждается в утечке ресурса, а не утилизации его вообще. Если одноразовый ресурс имеет финализатор, возможно, он будет очищен в конце концов, но не все одноразовые ресурсы сделают это.

Если вы можете изменить асинхронный метод каким-то образом, то вам просто нужно позвонить Dispose в функции обратного вызова, или в продолжение этой задачи, или в обработчик соответствующего события. Вы не сможете использовать using, если не сможете выполнить асинхронную операцию (потому что await просто потрясающе).

+0

Это не совсем так. Асинхронный метод возвращает задачу. Извините за путаницу. Я имел в виду, что он не имеет обратного вызова, переданного как часть его подписи. –

+0

@BrianTriplett Если он возвращает задачу, вы можете просто вызвать 'ContinueWith' в качестве средства добавления обратного вызова или, еще лучше, ждать его. – Servy

+0

Можете ли вы привести пример? Где будет ждать? Внутри блока использования? Будет ли это требовать, чтобы метод, содержащий блок использования, теперь был помечен как async? –

Смежные вопросы