C# 处理异步和同步代码之间的边界?
我正在尝试编写一些异步c代码,但在理解C# 处理异步和同步代码之间的边界?,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,我正在尝试编写一些异步c代码,但在理解asyncvs.Wait()的资源时遇到了一些问题。我读过很多帖子和网站,但不知何故,我仍然不知道如何/为什么我不应该使用等待。我的课程目标是: 异步启动某事 做些工作 等待#1完成 做更多需要完成的工作 我的任务包括: public static void Main() { Task t = DoWork(); DoMoreWork(); t.Wait(); DoWorkThatNeedsT(); } public Tas
async
vs.Wait()
的资源时遇到了一些问题。我读过很多帖子和网站,但不知何故,我仍然不知道如何/为什么我不应该使用等待。我的课程目标是:
public static void Main()
{
Task t = DoWork();
DoMoreWork();
t.Wait();
DoWorkThatNeedsT();
}
public Task DoWork()
{
return Task.Run(() => {Thread.Sleep(1000);});
}
据我所知,在本例中使用async await只涉及将DoWork()更改为以下内容:
public async Task DoWork()
{
return await Task.Run(() => {Thread.Sleep(1000);});
}
然后在调用方法中仍然有一个
.Wait()
。这是否应该获得无线程异步的好处?有没有其他方法可以实现这一点?您所描述的不是async/await的用途。Async/await用于将线程释放回操作系统,供其他系统使用,同时系统等待它无法控制的内容(例如,在远程系统上等待sql语句完成)
您想要的是与其他代码并行运行任务。使用async/Wait,但不要担心,因为您没有真正需要的东西
了解何时使用async/await是一本很好的读物。您在异步地做什么?否则,使用异步就没有意义了。另外,
Task.Run()
不是解决方案,因为它会无缘无故地启动另一个线程。Task.Run中的任何内容都是异步完成的。在这种情况下,它只是睡一会儿。在我的实际程序中,它是删除一些文件并运行一个外部程序。。。你所描述的不是用来做什么的。而是使用后台工作程序/task.run。我在下面解释。我不明白你在问什么。从同步/阻塞代码调用async
,有很多关于堆栈溢出寻址的问答。包括源于Main()
(本质上不是异步的)的场景。但是在上面的代码中,您提议的将DoWork()
作为async
方法的更改似乎毫无意义;它对整个实现毫无意义。它也与main方法中对Wait()
的调用无关,这似乎是您要问的问题。请修正你的问题;解释你读过的内容以及你具体不理解的内容。@PeterDuniho我正在阅读文档页/SO问题,这些问题说明你几乎不应该使用.Wait(),而应该使用Wait。我不确定该指南是如何应用于这种情况的(或者如何在没有.Wait()的情况下正确地实现它),因此产生了这个问题。根据注释,代码应该保持原样,而不使用async/await。