gpt4 book ai didi

c# - 异步编程控制流程

转载 作者:太空狗 更新时间:2023-10-29 21:22:58 26 4
gpt4 key购买 nike

我在过去 2 天里一直在阅读有关 c# 异步方法的内容,据我了解,与线程 (threadpool.queueuserworkitem()) 不同,对异步方法的调用不会返回立即返回,只有当被调用的方法遇到等待或完成(或异常)时才返回

请看下面的例子。

public partial class MainWindow : Window
{
// . . .
private async void startButton_Click(object sender, RoutedEventArgs e)
{
// ONE
Task<int> getLengthTask = AccessTheWebAsync();

// FOUR
int contentLength = await getLengthTask;

// SIX
resultsTextBox.Text +=
String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
}


async Task<int> AccessTheWebAsync()
{
// TWO
HttpClient client = new HttpClient();
Task<string> getStringTask =
client.GetStringAsync("http://msdn.microsoft.com");

// THREE
string urlContents = await getStringTask;

// FIVE
return urlContents.Length;
}
}

据我所知,在上面的代码中,AccessTheWebAsync() 被同步调用(即调用时控件不会立即返回)。但在名为“THREE”的行中,运行时将返回控制权。

我的问题是:

  1. 运行时如何决定何时使用线程池或何时在调用线程中运行任务? (即执行代码而不返回控制权)

  2. 上面代码中的哪些点会使用新线程(或线程池)?

  3. 如果 AccessTheWebAsync() 执行了一些计算密集型操作,例如运行具有无数次迭代的循环,则控制只会在循环完成时返回给调用者。是吗?

  4. 在异步函数中,有没有办法立即返回控制权,然后在后台线程中继续执行工作? (就像我们调用 threadpool.queueuserworkitem() 一样)

  5. 调用不带 await 的异步方法(假设可能)与调用非异步方法是否相同?

最佳答案

首先是重要的事情:如果要等待的任务尚未完成,运行时只会在 await 时返回给调用者。

问题 1:我将在此处引用 MSDN:

The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread.

Source

问题 2:也许在 GetStringAsync 的实现中,但我们不知道,也不必知道。我们知道 GetStringAsync 以某种方式在不阻塞线程的情况下获取结果就足够了。

问题3:如果循环放在await关键字之前,可以。

问题 4:引用与之前相同的段落:

You can use Task.Run to move CPU-bound work to a background thread

为此,您不需要 asyncawait 关键字。示例:

private Task<int> DoSomethingAsync()
{
return Task.Run(() =>
{
// Do CPU heavy calculation here. It will be executed in the thread pool.
return 1 + 1;
});
}

问题5:我再报价

An async method typically contains one or more occurrences of an await operator, but the absence of await expressions doesn’t cause a compiler error. If an async method doesn’t use an await operator to mark a suspension point, the method executes as a synchronous method does, despite the async modifier. The compiler issues a warning for such methods.

Source (和以前一样的页面,只是一个不同的部分)

关于c# - 异步编程控制流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16978904/

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