Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 在异步方法内调用时,方法是否必须是异步的?_C#_.net_Asynchronous - Fatal编程技术网

C# 在异步方法内调用时,方法是否必须是异步的?

C# 在异步方法内调用时,方法是否必须是异步的?,c#,.net,asynchronous,C#,.net,Asynchronous,假设我有一个定义如下的方法: public async Task CreateUser() { await GetUserDetails(); GetUserOrder(); } private void GetUserDetails() { private void GetUserOrder() { 方法是否执行GetUserDetails()和GetUserOrder()也必须是async以避免UI阻塞 我不能等待GetUserDetails()方法,因为它不是异步的。如何

假设我有一个定义如下的方法:

public async Task CreateUser()
{
   await GetUserDetails();
   GetUserOrder();
}

private void GetUserDetails() {

private void GetUserOrder() {
方法是否执行
GetUserDetails()
GetUserOrder()
也必须是
async
以避免UI阻塞


我不能
等待
GetUserDetails()方法,因为它不是异步的。如何在c#中实现这一点?我想确保一步一步地调用所有这些方法。

如果要等待,则必须为该方法编写
wait
。因为在第一次等待代码之后,AGIA将是同步的。如果UI线程超过它,它将在其上运行

1.您的代码将是异步的,因此通过此代码,您的代码对于GetUserORder也是异步的。您只需将方法包装在任务构造中并返回

public async Task CreateUser()
{
   await GetUserDetails();
   await Task.Factory.SartNew(()=> GetUserOrder());
}
或者你也可以这样做

public async Task CreateUser()
{
   await  Task.Factory.SartNew(()=>{
           GetUserDetails();
           GetUserOrder(); });
}
3.或者您也可以这样做,在下面的代码中将不等待getuserorder方法,而执行等待一个方法

 public async Task CreateUser()
    {
       Task.Factory.SartNew(()=> GetUserOrder()).ContinueWith((t)=> Console.WriteLine("Completed");
       await GetUserDetails();
    }
4.或者最后一个变体,在这里,您首先启动GetUserOrder,不等待它,然后以异步方式调用GetUserDetails,如果您想使用GetUserOrder方法wait,只需使用wait方法

 public async Task CreateUser()
    {
      var task =  Task.Factory.SartNew(()=> GetUserOrder());
       await GetUserDetails();   
       if(!task.IsCompleted)
       task.Wait(); 
    }
在你的情况下,你可以选择3个,如果你想等待,可以选择第4个



正如您在评论中问我的那样,Task.Run和statnew方法之间的区别是什么:为此,您可以检查这个SO问题:

如果您想等待,那么您也必须为该方法编写
wait
。因为在第一次等待代码之后,AGIA将是同步的。如果UI线程超过它,它将在其上运行

1.您的代码将是异步的,因此通过此代码,您的代码对于GetUserORder也是异步的。您只需将方法包装在任务构造中并返回

public async Task CreateUser()
{
   await GetUserDetails();
   await Task.Factory.SartNew(()=> GetUserOrder());
}
或者你也可以这样做

public async Task CreateUser()
{
   await  Task.Factory.SartNew(()=>{
           GetUserDetails();
           GetUserOrder(); });
}
3.或者您也可以这样做,在下面的代码中将不等待getuserorder方法,而执行等待一个方法

 public async Task CreateUser()
    {
       Task.Factory.SartNew(()=> GetUserOrder()).ContinueWith((t)=> Console.WriteLine("Completed");
       await GetUserDetails();
    }
4.或者最后一个变体,在这里,您首先启动GetUserOrder,不等待它,然后以异步方式调用GetUserDetails,如果您想使用GetUserOrder方法wait,只需使用wait方法

 public async Task CreateUser()
    {
      var task =  Task.Factory.SartNew(()=> GetUserOrder());
       await GetUserDetails();   
       if(!task.IsCompleted)
       task.Wait(); 
    }
在你的情况下,你可以选择3个,如果你想等待,可以选择第4个



正如您在评论中问我的,Task.Run和statnew方法之间的区别是什么-:为此,您可以检查这个SO问题:

您应该将wait仅放在异步方法前面。要运行不想等待的同步线程,可以使用tread池中的新线程:

new Thread(() => DoSomething()).Start();

以下是帮助页面:


否则,对
GetUserDetails
的调用必须在执行下一行之前完成。

您应该将wait仅放在异步方法前面。要运行不想等待的同步线程,可以使用tread池中的新线程:

new Thread(() => DoSomething()).Start();

以下是帮助页面:


否则,必须在执行下一行之前完成对
GetUserDetails
的调用。

相关问题在注释中:

我如何确保所有方法都完全按顺序调用

你问这个问题的事实表明你不明白什么是“等待”wait是异步工作流上的排序操作。等待
意味着在等待的任务完成之前,此工作流不会继续。这是一种异步等待,因此名为
await

考虑这个问题:在同步工作流中,排序操作是什么

不,真的,想一想

它是
。当你说

fResult = foo();
bResult = bar();
qResult = qux();
这意味着foo必须在酒吧开始前完全完成对于异步工作流来说,情况并非如此。如果我们有

fTask = fooAsync();
bTask = barAsync();
qTask = quxAsync();
然后异步操作可以按任意顺序完成。如果我们说

await fooAsync();
await barAsync();
await quxAsync();

然后,直到fooAsync的任务完成,barAsync才会启动<代码>等待
对异步工作流排序。区别在于线程可以在异步等待foo完成的同时继续执行其他无关的工作,这在同步工作流中是不正确的;在同步工作流中,线程已忙于计算foo结果,因此无法执行其他工作。

相关问题在注释中:

我如何确保所有方法都完全按顺序调用

你问这个问题的事实表明你不明白什么是“等待”wait是异步工作流上的排序操作。等待
意味着在等待的任务完成之前,此工作流不会继续。这是一种异步等待,因此名为
await

考虑这个问题:在同步工作流中,排序操作是什么

不,真的,想一想

它是
。当你说

fResult = foo();
bResult = bar();
qResult = qux();
这意味着foo必须在酒吧开始前完全完成对于异步工作流来说,情况并非如此。如果我们有

fTask = fooAsync();
bTask = barAsync();
qTask = quxAsync();
然后异步操作可以按任意顺序完成。如果我们说

await fooAsync();
await barAsync();
await quxAsync();

然后,直到fooAsync的任务完成,barAsync才会启动<代码>等待
对异步工作流排序。区别在于线程可以在异步等待foo完成的同时继续执行其他无关的工作,这在同步工作流中是不正确的;在同步工作流中,线程已经在忙于计算foo结果,因此它不能做其他工作。

除非是事件,否则绝对不应该使void方法异步。你真的需要在这里提供更多细节,
async/await
并不是让一切变得更快的神奇词汇,我们需要了解上下文
Task。添加
plus
Task.WaitAll
,你可以在这里看到@maccettura的参考:如果我让
私有异步任务GetUserDet怎么办