Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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#_Async Await_.net 4.5 - Fatal编程技术网

C# 何时使用;异步;而不是返回新任务。是否运行任务?

C# 何时使用;异步;而不是返回新任务。是否运行任务?,c#,async-await,.net-4.5,C#,Async Await,.net 4.5,这里有一个函数 static bool Login(SignupData sd) { bool success=false; /* Perform login-related actions here */ } 还有另外一个功能 static Task<bool> LoginAsync(SignupData sd) { return Task.Run<bool>(()=>Login(sd)); } 还是这个 async sta

这里有一个函数

static bool Login(SignupData sd)
{
   bool success=false;
   /*
      Perform login-related actions here
   */
}
还有另外一个功能

static Task<bool> LoginAsync(SignupData sd)
{
   return Task.Run<bool>(()=>Login(sd));
}
还是这个

async static Task<bool> LoginAsync(SignupData sd)
{
    bool success=Login(sd);
    return success;
}
异步静态任务登录同步(SignUpdatea sd)
{
bool success=登录(sd);
回归成功;
}

您也不应该这样做。如果异步方法可以防止线程被阻塞,则它们非常有用。在您的情况下,您的方法并没有避免这一点,它总是阻塞线程

如何处理长阻塞调用取决于应用程序。对于UI应用程序,您希望使用
任务。运行
以确保不阻塞UI线程。例如,对于web应用程序,您不想使用
Task.Run
,您只想使用已有的线程,以防止在一个线程足够的情况下使用两个线程

您的异步方法无法可靠地知道什么最适合调用方,因此不应该通过其API表明它最了解。您应该只使用同步方法,由调用方决定


也就是说,我建议寻找一种方法来创建真正异步的
LoginAsync
实现。例如,如果它从数据库加载数据,请使用
OpenAsync
打开连接,使用
ExecuteReaderAsync
检索数据。如果它连接到web服务,请使用异步方法连接您正在使用的任何协议。如果它以其他方式登录,请执行任何需要使其异步的操作


如果您采用这种方法,那么
async
await
关键字非常有意义,可以使这样的实现非常容易创建。

您也不应该这样做。如果异步方法可以防止线程被阻塞,则它们非常有用。在您的情况下,您的方法并没有避免这一点,它总是阻塞线程

如何处理长阻塞调用取决于应用程序。对于UI应用程序,您希望使用
任务。运行
以确保不阻塞UI线程。例如,对于web应用程序,您不想使用
Task.Run
,您只想使用已有的线程,以防止在一个线程足够的情况下使用两个线程

您的异步方法无法可靠地知道什么最适合调用方,因此不应该通过其API表明它最了解。您应该只使用同步方法,由调用方决定


也就是说,我建议寻找一种方法来创建真正异步的
LoginAsync
实现。例如,如果它从数据库加载数据,请使用
OpenAsync
打开连接,使用
ExecuteReaderAsync
检索数据。如果它连接到web服务,请使用异步方法连接您正在使用的任何协议。如果它以其他方式登录,请执行任何需要使其异步的操作


如果您采用这种方法,那么
async
await
关键字非常有意义,并且可以使这样的实现非常容易地创建。

虽然HVD是正确的,但我将深入讨论异步,试图描述它的预期用途

async关键字和附带的await关键字是在应用程序中实现非阻塞代码模式的快捷方法。虽然它与任务并行库(TPL)的其余部分配合得很好,但它的使用通常并不完全相同。它的美妙之处在于编译器如何优雅地编织异步性,并允许在不显式地分离线程的情况下处理它,这可能是您想要的,也可能不是您想要的

例如,让我们看一些代码:

async static Task<bool> DoStuffAsync()
{
    var otherAsyncResult = doOtherStuffAsync();

    return await otherAsyncResult
}
异步静态任务DoStuffAsync()
{
var otherAsyncResult=doOtherStuffAsync();
返回等待其他异步结果
}
看到等待关键字了吗?它说,返回到调用方,继续,直到我们得到您需要的结果。不要阻塞,不要使用新线程,但基本上会在准备好(任务)时返回结果。然后调用代码可以继续进行,直到我们有了它之后才担心结果

通常,这最终要求代码在整个过程中都是非阻塞的(一直是异步的),这通常是一个很难理解的转换。然而,如果你能做到的话,它是非常强大的

处理代码的更好方法是让同步代码调用异步代码,然后等待它。这样,您将尽可能地异步。最好是在应用程序中尽可能地提高该级别,如果可能的话,一直到UI

希望这是有道理的。TPL是一个巨大的主题,Async/Await确实添加了一些构造代码的有趣方法。

虽然HVD是正确的,但我将深入讨论async,试图描述它的预期用途

async关键字和附带的await关键字是在应用程序中实现非阻塞代码模式的快捷方法。虽然它与任务并行库(TPL)的其余部分配合得很好,但它的使用通常并不完全相同。它的美妙之处在于编译器如何优雅地编织异步性,并允许在不显式地分离线程的情况下处理它,这可能是您想要的,也可能不是您想要的

例如,让我们看一些代码:

async static Task<bool> DoStuffAsync()
{
    var otherAsyncResult = doOtherStuffAsync();

    return await otherAsyncResult
}
异步静态任务DoStuffAsync()
{
var otherAsyncResult=doOtherStuffAsync();
返回等待其他异步结果
}
看到等待关键字了吗?它说,返回到调用方,继续,直到我们得到您需要的结果。不要阻塞,不要使用新线程,但基本上会在准备好(任务)时返回结果。然后调用代码可以继续进行,直到我们有了它之后才担心结果

通常,这最终要求代码在整个过程中都是非阻塞的(一直是异步的),这通常是一个很难理解的转换。然而