[英]Is it viable to use await/async and threads simultaneously on one method?
我是多线程技术的新手,我有一个(可能)关于同时使用线程和同时等待/异步的简单问题。 我有一个读取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的帮助下编辑的代码
手动创建和操作线程是一种高级多线程技术,它要求开发人员真正了解他在做什么(因为内存隔离,线程之间的同步和编组都是非常高级的主题,容易弄乱)。 线程安全性很难。
如果您想要的只是提高应用程序的响应能力,那么几年前已添加到.NET的async和await构造是完美的。 它们不一定与多线程相关,因为它是决定是否创建新线程的基础机制(并非总是如此)。
您正在做的是创建一个线程并在该线程上运行ReadTCP
方法。
您可以轻松地修复ReadTCP
,使其返回Task
( async void
确实是一种不好的做法!),然后像这样使用它: var response = await ReadTCP();
在async
方法中,它将为您提供所需的内容。
要在同时运行ReadTCP
同时并行运行东西,请为任务创建一个变量,然后await
它:
var readTask = ReadTCP();
DoOtherStuff();
AndMoreStuff();
AllAtOnce();
var response = await readTask;
DoSomethingWith(response);
顺便说一下,您不必在Task.Run
包装异步方法。 而不是这样做: Task.Run(() => FPXreaderTCP.ReadToEndAsync());
,只需await FPXreaderTCP.ReadToEndAsync()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.