我有许多Utils类,我用于许多不同的项目,其中大多数是静态的,并且由静态方法构成,通常甚至不会相互调用.
我的目的是利用新的async/await功能,但不重写所有内容,所以我的问题是:我可以使用Task.Run(()=> MethodName)为每个名为MethodAsync的现有方法添加一个新方法吗?
例:
//old code that will not be removed static void DoSomething() { ... } //new code that will be added static async Task DoSomethingAsync() { //not really sure if Im supposed to use await/async here. //isn't Task awaitable even without async?? return await Task.Run(() => DoSomething()); }
基本上在旧代码中我只有一个普通的同步方法,而在新代码中,我有一个异步方法,如果CLR将其视为CPU绑定方法,它甚至可以在另一个线程中运行.
如果我正确理解,每个异步方法都按定义包含等待一个等待的对象,这是一个Task或另一个异步方法.
这意味着每当我可以使用异步.NET方法时,我应该等待它并将我的调用方法标记为异步.
但是,应该使用Task.Run调用调用其他每个不调用任何异步方法但可能需要一些时间才能完成的方法.
对?
编辑
所以我已经阅读了所有发布的链接,msdn上的最佳实践和一些博客文章,但是在使用新的async/await功能进行编码时,我还需要一个完整的例程.这是我到目前为止所得到的:
1)每个具有异步备选方案的.NET方法都应该使用异步备选方法.(据我所知,.NET异步方法仅适用于可以异步的方法).
2)每个使用异步方法的方法也应该是异步的.
3)每个不使用异步方法的方法(因为没有可用)但仍然需要一些cpu-time来执行应该通过使用Task.Run包装来实现异步(我知道在这种情况下它应该是客户端如果他们想要使用Task.Run,但由于我只为执行时间超过50ms的方法添加这些包装器,并且仍然可以使用该方法的非异步版本,我仍然不明白为什么我不应该将此包装器放在库中).
4)每个采用非cpu-time的方法导致它等待其他源(如Internet,数据库,事件等)应该使用TaskFactory.FromAsync或TaskCompletionSource.
5)System.Threading.Tasks.Parallel.Invoke(method1,method2等等)现已弃用.从我读到的内容,如果CLR认为需要并发,Task.Run已经运行并发线程.因此,似乎Task.Run在需要时已经使用了Parallel.Invoke.