Я новичок в этой области C# и, честно говоря, изо всех сил пытаюсь уловить парадигму. Кажется, я не одинок ( Где асин c и ждет конца? Путаница , http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html)
В моем случае я пишу небольшой TCP-сервер в библиотеке C#, по сути, TCP-сервер должен работать в своем собственном потоке и отправлять данные обратно в приложение через предоставленный обратный вызов. Таким образом, у нас может быть точка входа в библиотеку:
class MyServer
{
void StartServerRunningAsync(Callback callback)
{
this.callback = callback; //calls back into unmanaged via 'magic' COM interop each time a TCP client posts interesting data
StartRunningThread(); //this creates a thread to run the server and returns
}
void StartRunningThread()
{
new Thread(new ThreadStart(Run)).Start();
}
void Run()
{
//do standard TCP async stuff treating `Run` like a local `Main`
}
}
Эта библиотека будет использоваться из неуправляемого приложения C ++ (в частности, через COM), которое запускает сервер в фоновом режиме. Так что я не думаю, что StartServerRunning
может / должно быть async
, но это означает, что я застрял / запутался, как вообще использовать async
/ await
, поскольку он распространяется по всему вашему стеку на основе ссылок. над.
Это действительно проблема или я неправильно понял что-то фундаментальное? Как TPL может быть заключен в капсулу таким образом?