gpt4 book ai didi

c# - 何时使用 "async"而不是返回新的 Task.Run 任务?

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:12 24 4
gpt4 key购买 nike

所以这里我有一个函数

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返回 Task<TResult> 的函数的关键字(这样它最终看起来像:async Task<TResult> LoginAsync(SignupData sd))。在这种情况下,即使您返回 TResult而不是 Task<TResult> ,程序仍然可以编译。

我的问题是,应该首选哪种实现?

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;
}

最佳答案

你也不应该这样做。如果异步方法可以防止线程被阻塞,那么它们是有用的。在您的情况下,您的方法不会避免这种情况,它总是会阻塞一个线程。

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

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


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

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

关于c# - 何时使用 "async"而不是返回新的 Task.Run 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35994404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com