1

还是我必须在方法中使用 Task.Run 以确保每个函数都存在于自己的线程上?我试图看看我在我正在处理的代码中看到的这种做法是否有任何智慧。

public async Task<string> GetAStringAfterSyncProcessing(string processThis) {
       return await Task.Run(async () => { 
              var processThis2 = processThis + ",";
              var processThis3 = processThis2 + ",";
              var nowImDone = processThis3 + ",";
              return nowImDone;
       });
}

我有一种感觉,这是一种无意的设计,因为它使得在调试时无法遍历每一行。所以我想知道我是否正确地向其他人解释异步自动意味着创建一个新线程,以便仅在使用 await 或 .GetAwaiter().GetResult() 时调用该函数。谢谢

4

1 回答 1

3

不,async它本身不会创建新线程。

在您演示的代码中使用async/毫无意义。await它主要相当于:

public Task<string> GetAStringAfterSyncProcessing(string processThis) {
    return Task.Run(() => { 
        var processThis2 = processThis + ",";
        var processThis3 = processThis2 + ",";
        var nowImDone = processThis3 + ",";
        return nowImDone;
    });
}

(我也删除了异步 lambda,这是不必要的。)

下一个:

所以我想知道我是否正确地向其他人解释异步自动意味着创建一个新线程,以便仅在使用 await 或 .GetAwaiter().GetResult() 时调用该函数。

不,这绝对不是正确的解释。仅在 SO 答案中很难给出完整的低调,但我强烈建议您阅读MSDN 资源,了解 async/await 的实际含义。有一种期望,即无论您等待什么,本质上都是异步的——这是因为它本身启动了一个线程,或者因为它不需要线程来实现异步(例如异步 IO)。

于 2013-08-22T17:04:06.583 回答