异步调用是否始终创建新线程?两者有什么区别?
异步调用是始终创建还是使用新线程?
在计算机编程中,异步事件是独立于主程序流发生的事件.异步操作是在非阻塞方案中执行的操作,允许主程序流继续处理.
我知道异步调用可以在单线程上完成吗?这怎么可能?
我正在研究这个问题,寻找一种在.NET中创建基于事件的单线程非阻塞异步Web服务器的方法.
这个答案首先看起来很有希望,声称代码的主体在一个线程中运行.
但是,我在C#中对此进行了测试:
using System;
using System.IO;
using System.Threading;
class Program
{
static void Main()
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
var sc = new SynchronizationContext();
SynchronizationContext.SetSynchronizationContext(sc);
{
var path = Environment.ExpandEnvironmentVariables(
@"%SystemRoot%\Notepad.exe");
var fs = new FileStream(path, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite, 1024 * 4, true);
var bytes = new byte[1024];
fs.BeginRead(bytes, 0, bytes.Length, ar =>
{
sc.Post(dummy =>
{
var res = fs.EndRead(ar);
// Are we in the same thread?
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
}, null);
}, null);
}
Thread.Sleep(100);
}
} …Run Code Online (Sandbox Code Playgroud) 是否可以在与调用者相同的线程中异步定义和调用方法?假设我只有一个核心,我不希望线程管理开销与100个线程一样.
编辑 我问的原因是nodejs服务模型 - 一个线程上的所有东西都没有阻塞任何东西,这被证明是非常有效的,这让我想知道C#中是否有相同的东西(我自己无法实现).
Edit2嗯,正如评论节点中所指出的那样,节点毕竟不是单线程的(不过简单的负载测试显示,它只使用一个核心...),但我认为是什么让它如此高效是隐含的要求只写非阻止代码.这在C#中是可能的,除了不需要:)无论如何,谢谢大家...