C#任务。在.NET4.0中运行等效程序
我有以下代码,它在.NET 4.5中运行良好C#任务。在.NET4.0中运行等效程序,c#,async-await,C#,Async Await,我有以下代码,它在.NET 4.5中运行良好 return Task.Run(async () => await MyAsyncMethodThatReturnsAnObject()).Result; 现在我需要让它在.NET 4.0上运行,所以我想到了: return Task.Factory.StartNew<object>(async () => { await MyAsyncMethodThatReturnsAnObject()}).Result; retur
return Task.Run(async () => await MyAsyncMethodThatReturnsAnObject()).Result;
现在我需要让它在.NET 4.0上运行,所以我想到了:
return Task.Factory.StartNew<object>(async () => { await MyAsyncMethodThatReturnsAnObject()}).Result;
return Task.Factory.StartNew(async()=>{await myasynchmethodthattreturnsanobject()});
但这给了我一个错误:
“任务”不包含GetWaiter的定义,并且没有
扩展方法“GetAwaiter”接受类型为的第一个参数
“任务”
MyAsyncMethodThatReturnsAnObject
是一个工厂方法,其返回类型为object
async/await是.NET4.5。
您需要安装Microsoft.Bcl.Async,它才能在4中工作。Task.Factory.StartNew(()=>
Task.Factory.StartNew<object>(() =>
MyAsyncMethodThatReturnsAnObject().Result,
TaskScheduler.Default
).Result
MyAsyncMethodThatReturnsAnObject()。结果,
TaskScheduler.Default
).结果
在这两种情况下,委托异步()=>等待MyAsyncMethodThatReturnsAnObject()
相当于()=>MyAsyncMethodThatReturnsAnObject()
。更好的问题是,为什么要这样做?释放一个线程以阻止另一个线程?如果.NET 4.0没有async/await,如何让代码在.NET 4.0上运行。您是否使用了Microsoft.Bcl.Async
?@AndreFeijo那么您不应该阻塞异步操作,不应该创建新线程,在整个操作过程中什么都不做,也不应该让底层操作一直同步,而不是半途而废。你在这两个世界中都遇到了最坏的情况,然后又遇到了更多的问题,这两个问题都没有好处。注意:如果你使用的是Microsoft.Bcl.Async
,你可以只使用return TaskEx.Run(Async()=>wait myasynchmethodthatReturnsAnObject()).return
类TaskEx
中有新的任务静态方法,如Run(
,至少您应该传入TaskScheduler。默认值为,以防止在代码返回时导致任务代码在UI线程上运行的错误。@ScottChamberlain感谢您的评论,我编辑了我的答案以传递TaskScheduler。默认值为任务的默认行为。运行注意如果您使用的是Microsoft.Bcl.Async
,则可以使用TaskEx.Run(
而不是Task.Run(