我刚接触多线程,我有一个(可能)关于同时使用线程和await/async的简单问题。我有一个方法,它读取TCP流,然后处理它接收到的响应。它的名字如下所示:
ThreadStart ts = new ThreadStart(ReadTCP);
Thread tt = new Thread(ts);从流中异步读取数据是否可行?如下面的代码所示:
private async void ReadTCP()
{
string responseData = string.Empty;
if(streamTCP.DataAvailable)
{
responseData = await readerTCP.ReadToEndAsync();
// some code handling the response
}
}使用MarioDS's help编辑的代码
发布于 2017-08-28 17:56:25
手动创建和操作线程是一种高级的多线程技术,这需要开发人员真正地知道他在做什么(因为内存隔离、线程之间的同步和编组都是非常高级的主题,很容易搞砸)。线程安全是很困难的。
如果您想要的只是提高应用程序的响应性,那么几年前添加到.NET中的async和await结构就是完美的选择。它们不一定与多线程相关,因为它是决定是否创建新线程的底层机制(并不总是如此)。
您要做的是创建一个线程并在该线程上运行ReadTCP方法。
您可以很容易地修复ReadTCP,使其返回Task (async void是非常糟糕的做法!)然后像这样使用它:在async方法中使用var response = await ReadTCP();,它会给你想要的东西。
要在运行ReadTCP的同时并行运行程序,请为任务创建一个变量,并在稍后对其执行await:
var readTask = ReadTCP();
DoOtherStuff();
AndMoreStuff();
AllAtOnce();
var response = await readTask;
DoSomethingWith(response);顺便说一句,您不必在Task.Run中包装异步方法。不要做:Task.Run(() => FPXreaderTCP.ReadToEndAsync());,只要做await FPXreaderTCP.ReadToEndAsync()就行了。
https://stackoverflow.com/questions/45916116
复制相似问题