Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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#_Asynchronous - Fatal编程技术网

C# 在无法完成独立工作的情况下使用异步是否有用/值得?

C# 在无法完成独立工作的情况下使用异步是否有用/值得?,c#,asynchronous,C#,Asynchronous,MSDN异步示例给出了以下示例: async Task<int> AccessTheWebAsync() { Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); // You can do work here that doesn't rely on the string from GetStringAsync. DoIndepende

MSDN异步示例给出了以下示例:

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

    // You can do work here that doesn't rely on the string from GetStringAsync.
    DoIndependentWork();

    string urlContents = await getStringTask;
    return urlContents.Length;
}
现在,假设存在一个同步的
client.GetString()
方法,并且这两个方法之间没有可以完成的独立工作,那么编写类似这样的东西会带来任何好处吗?在这种情况下,这两个电话有什么不同吗

string urlContents = await client.GetStringAsync();
vs

在这种情况下,这两个电话有什么不同吗

string urlContents = await client.GetStringAsync();
是的它们是不同的

第一个导致方法不在UI线程上执行,这将导致应用程序保持响应,而第二个则不是这样,如果方法执行需要更多时间,UI将保持阻塞,用户将无法与应用程序交互

string urlContents = await client.GetStringAsync(); // non blocking call

string urlContents = client.GetString(); // this is blocking current Thread

第一个将等待,直到客户端返回并阻止任何其他内容,然后再转到下一行

第二个线程将等到客户机返回后再转到下一行,但同时其他线程可以执行不依赖于结果的工作

在这种情况下,这两个电话有什么不同吗

第一种是异步的;这意味着调用线程在
GetStringAsync
进行过程中被释放出来做其他事情

第二个是同步的;这意味着调用线程在进行
GetString
时被阻塞

在客户端,异步代码的主要好处是响应能力。也就是说,UI线程被释放以响应用户输入


在服务器端,异步代码的主要好处是可伸缩性。也就是说,请求线程被释放以响应其他请求。

第一个线程将在UI线程上执行方法not,而第二个线程将在UI线程上调用它,UI线程将阻止UIAsync,通常是在等待IO时释放线程。如果执行单个线程,可能不会提高性能,但在Web服务器上,在等待db调用或文件访问时不浪费资源可以让您使用更少的资源。因此,它基本上释放当前线程,直到db应答为止?事实上,独立工作的想法是非常罕见的异步IO使用。几乎所有的用途都是保存线程和解除客户端应用程序中的UI阻止。除非将响应用户输入(或在web应用程序中响应其他web请求)计算为“独立工作”,否则很少会没有独立工作要做。假设该方法需要3秒钟才能返回,光标将在第一行停留3秒钟,就像在第二行一样。请仔细解释它是非阻塞的吗?在这两种情况下,它都会停止3秒钟,区别在于第一个不会在UI线程上执行,而第二个会在UI线程上执行,所以如果需要3秒钟,用户将无法与应用程序进行任何其他交互
string urlContents = await client.GetStringAsync(); // non blocking call

string urlContents = client.GetString(); // this is blocking current Thread