我有很多Utils类,我用于许多不同的项目,其中大多数是静态的,通常甚至不会互相调用。我的意图是利用新的异步/等待功能,但不重写所有的东西,所以我的问题是:我可以添加一个新的方法为每个现有的方法命名MethodAsync与Task.Run((()=>方法名)?用异步/等待重写我的Utils库的正确方法
例如:
//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上的最佳实践和一些博客文章,但我仍然需要一个完整的程序来遵循新的异步编码时/等待功能。 这是我到目前为止:
1)具有异步替代的每个.NET方法应该使用异步替代。 (据我所知,.NET异步方法已经存在,只适用于可以异步的方法)。 2)每个使用异步方法的方法也应该做成异步。 3)每个不使用异步方法的方法(因为没有可用的)但仍需要一些cpu时间来执行应该通过使用Task.Run包装它们来实现异步(我知道在这种情况下它应该是使用Task.Run的客户端,如果他们想要的话,但因为我只为那些需要超过50ms执行的方法添加这些包装器,并且仍然可以使用该方法的非异步版本,所以我仍然不明白为什么我不应该把这个包装放入库中)。
4)每一个需要非cpu-time的方法都会导致它等待其他资源(如internet,数据库,事件等等)应该使用TaskFactory.FromAsync或TaskCompletionSource。
5)现在不推荐使用System.Threading.Tasks.Parallel.Invoke(method1,method2等)。从我读的Task.Run已经运行并发线程,如果CLR认为需要并发。所以看起来Task.Run已经在需要的时候使用了Parallel.Invoke。
不要那样做。除非它们实际上是异步的,否则不要创建'* Async()'方法;永远不要在库中调用Task.Run()。 http://msdn.microsoft.com/en-us/magazine/jj991977.aspx – SLaks
[我应该公开同步方法的异步包装?](http://blogs.msdn.com/b/pfxteam/archive/2012/ 04/13/10293638.aspx) – ken2k
它说'Parallel.Invoke'已被弃用?它在哪里声明'Task.Run'使用'Parallel.Invoke'?我认为它导致了'ThreadPool'的使用。 – Lukazoid