繁体   English   中英

在一种方法中同时使用等待/异步和线程是否可行?

[英]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 ,使其返回Taskasync 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM