首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个方法上同时使用await/async和线程是可行的吗?

在一个方法上同时使用await/async和线程是可行的吗?
EN

Stack Overflow用户
提问于 2017-08-28 17:46:28
回答 1查看 66关注 0票数 0

我刚接触多线程,我有一个(可能)关于同时使用线程和await/async的简单问题。我有一个方法,它读取TCP流,然后处理它接收到的响应。它的名字如下所示:

代码语言:javascript
复制
ThreadStart ts = new ThreadStart(ReadTCP);
Thread tt = new Thread(ts);

从流中异步读取数据是否可行?如下面的代码所示:

代码语言:javascript
复制
    private async void ReadTCP()
    {
        string responseData = string.Empty;  

        if(streamTCP.DataAvailable) 
        {
            responseData = await  readerTCP.ReadToEndAsync();

            // some code handling the response
        }
    }

使用MarioDS's help编辑的代码

EN

回答 1

Stack Overflow用户

发布于 2017-08-28 17:56:25

手动创建和操作线程是一种高级的多线程技术,这需要开发人员真正地知道他在做什么(因为内存隔离、线程之间的同步和编组都是非常高级的主题,很容易搞砸)。线程安全是很困难的。

如果您想要的只是提高应用程序的响应性,那么几年前添加到.NET中的async和await结构就是完美的选择。它们不一定与多线程相关,因为它是决定是否创建新线程的底层机制(并不总是如此)。

您要做的是创建一个线程并在该线程上运行ReadTCP方法。

您可以很容易地修复ReadTCP,使其返回Task (async void是非常糟糕的做法!)然后像这样使用它:在async方法中使用var response = await ReadTCP();,它会给你想要的东西。

要在运行ReadTCP的同时并行运行程序,请为任务创建一个变量,并在稍后对其执行await

代码语言:javascript
复制
var readTask = ReadTCP();
DoOtherStuff();
AndMoreStuff();
AllAtOnce();
var response = await readTask;
DoSomethingWith(response);

顺便说一句,您不必在Task.Run中包装异步方法。不要做:Task.Run(() => FPXreaderTCP.ReadToEndAsync());,只要做await FPXreaderTCP.ReadToEndAsync()就行了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45916116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档