c# – 创建异步包装器的方法
如何为同步方法创建异步包装器更好?
// sync method public void LongOperation() { //code... } // versions of wrapper public async Task LongOpertionWrapperAsyncV1() { var task = Task.Factory.StartNew(LongOperation); await task.ConfigureAwait(false); } public Task LongOpertionWrapperAsyncV2() { var task = Task.Factory.StartNew(LongOperation); task.ConfigureAwait(false); return task; } 虽然两个版本的使用没有区别. async Task Executor() { await LongOpertionWrapperAsyncV1(); await LongOpertionWrapperAsyncV2(); } 对于返回值的方法(Task< T>),我使用第一个版本. 但我想知道你的意见. 这些版本之间存在一般差异吗? 解决方法
你应该使用“像V2这样的东西:
public Task LongOpertionWrapperAsyncV2() { return Task.Run(LongOperation); } 和 async Task Executor() { await LongOpertionWrapperAsyncV2().ConfigureAwait(false); } 与V1相比,这可以节省一个上下文切换.只要你不需要“等待另一个操作”并且async-Task是方法中的最后一个操作,你就可以返回任务而不是等待它,并将await留给调用者(也可以或不能添加) ConfigureAwait). 只有在你想提供像HPT建议的TaskCreationOptions.LongRunning时,才需要Task.Factory.StartNew. 更新: public Task<byte[]> ReadAsync(int length) { return Task.Run(() => hwDevice.Read(length)); } hwDevice.Read仍然会锁定线程,但不会锁定CPU,因此UI在此期间响应我们正在等待IO(在“实时”中也是一些取消和错误处理逻辑). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |