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();
返回等待其他异步结果
}
看到等待关键字了吗?它说,返回到调用方,继续,直到我们得到您需要的结果。不要阻塞,不要使用新线程,但基本上会在准备好(任务)时返回结果。然后调用代码可以继续进行,直到我们有了它之后才担心结果
通常,这最终要求代码在整个过程中都是非阻塞的(一直是异步的),这通常是一个很难理解的转换。然而