C# .NET异步中的可伸缩性与响应性

C# .NET异步中的可伸缩性与响应性,c#,.net,multithreading,async-await,scalability,C#,.net,Multithreading,Async Await,Scalability,我正在通读这本书,给出了以下代码示例: 清单1-19 公共任务SleepAsyncA(整数毫秒) { 返回Task.Run(()=>thread.Sleep(毫秒计时); } 公共任务SleepAsyncB(整数毫秒) { TaskCompletionSource tcs=null; var t=新计时器(委托{tcs.TrySetResult(true);},-1,-1); tcs=新任务完成源(t); t、 变化(毫秒刺激,-1); 返回tcs.Task; } 该段规定: sleepsyn

我正在通读这本书,给出了以下代码示例:

清单1-19
公共任务SleepAsyncA(整数毫秒)
{
返回Task.Run(()=>thread.Sleep(毫秒计时);
}
公共任务SleepAsyncB(整数毫秒)
{
TaskCompletionSource tcs=null;
var t=新计时器(委托{tcs.TrySetResult(true);},-1,-1);
tcs=新任务完成源(t);
t、 变化(毫秒刺激,-1);
返回tcs.Task;
}
该段规定:

sleepsyncA
方法在运行时使用线程池中的线程 然而,第二种方法有着完全不同的效果 不同的实现,在等待时不占用线程 要运行的计时器。第二种方法提供可伸缩性


为什么A是响应的但B是可伸缩的?

A是响应的,因为它不阻塞对用户来说很重要的线程,因此具有异步的外观。UI仍然是流动的,但它不可伸缩,因为在引擎盖下它占用了有限的资源(通过阻塞线程)


B仍然是响应性的,但也是可伸缩的,因为它是真正的异步的,而不仅仅是表面上的异步。它不会占用任何有限的资源,即使UI仍然是流动的。

假设起点没有进程/线程/任务控制,并且是一个非响应的线程op,检查时间是否已过,例如:

public void SleepBadly(int millisecondsTimeout)
{
    var stopTime = DateTime.UtcNow.AddMilliseconds(millisecondsTimeout);
    while (DateTime.UtcNow < stopTime) {}
    return;
}

你能用你认为“响应”的意思来编辑你的问题吗?事实上,我也有点不确定。我能想到的唯一的例子是UI没有被线程锁定。这是书中的全部问题吗?有解释吗?第一种情况会使客户端UI更具响应性,第二种情况会使web应用程序(服务器)更具响应性更具可扩展性,但也会使客户端用户界面更具响应性,而第一个用户界面永远不会使web应用程序更具响应性,也会降低其可扩展性。@PauloMorgado这不是一个问题,但引用和示例是直接从中提出来的。@BanksySan,我能够下载该部分的示例章节(使用async和Wait)这一部分我已经读了好几遍了。我也认为作者是凭空提出了可伸缩性问题。全文似乎只讨论了客户端UI,没有任何解释就介绍了服务器的可伸缩性。
public void SleepBadly(int millisecondsTimeout)
{
    var stopTime = DateTime.UtcNow.AddMilliseconds(millisecondsTimeout);
    while (DateTime.UtcNow < stopTime) {}
    return;
}
public Task SleepAsyncC(int millisecondsTimeout)
{
    return Task.Delay(millisecondsTimeout);
}