我有一个网络服务和这个特殊的功能:
IAsyncResult func(object signature, AsyncCallback callBack, object asyncState)
我可以理解,使用await的唯一目的不是在进行非常长时间的操作时阻止UI 并且它还有一些回调函数可用于执行" func"
的结果在我的情况下,我必须等待(必须等待),直到我得到func的结果。
任何建议我应该等到我得到func的结果(换句话说,只要坚持到我得到结果)
编辑:
我为什么要这样做?
我只想检查签名是否属于特定类型。如果是,则该函数停止执行并返回0。 这是我从func中需要的唯一功能,并且看不出值得定义回调方法和状态对象。
答案 0 :(得分:5)
您所描述的是在任务之前的异步编程模型,并且在.NET至v.3.5中广泛使用。这是所有BeginXXX / EndXXX方法对使用的模型。
您可以使用convert APM calls to TPL方法FromAsync任务。以下示例来自文档,并从FileStream BeginRead和EndRead方法创建任务。
BeginRead的签名类似于func:
IAsyncResult BeginRead(byte[] array,int offset,
int numBytes,
AsyncCallback userCallback,
Object stateObject)
您可以将其转换为如下任务:
Task<int> task = Task<int>.Factory.FromAsync(
fs.BeginRead, fs.EndRead, data, 0, data.Length, null);
完成任务后,您可以等待它:
var bytes = await Task<int>.Factory.FromAsync(
fs.BeginRead, fs.EndRead, data, 0, data.Length, null);