Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#任务。在.NET4.0中运行等效程序_C#_Async Await - Fatal编程技术网

C#任务。在.NET4.0中运行等效程序

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

我有以下代码,它在.NET 4.5中运行良好

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(