Я смотрел этот вопрос, ища способ создания однопоточного асинхронного веб-сервера, не связанного с событиями, в .NET.
Этот ответ выглядел многообещающим сначала, утверждая, что тело кода работает в одном потоке.
Однако я тестировал это на С#:
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);
}
}
И результат:
1
5
Таким образом, кажется, что, вопреки ответу, поток, инициирующий чтение, и поток, заканчивающий чтение, не совпадают.
Итак, теперь мой вопрос: как вам достичь однопотокового, неблокирующего асинхронного веб-сервера в .NET?