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

时间:2017-08-28 09:46:28

标签: c# .net multithreading stream

我是多线程新手,我有一个关于同时使用线程和等待/异步的简单问题。我有一个方法,它读取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

编辑的代码

1 个答案:

答案 0 :(得分:2)

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

如果您只想提高应用的响应能力,那么几年前添加到.NET的异步和等待结构就非常完美。它们不一定与多线程有关,因为它是决定是否创建新线程的基础机制(并且并非总是如此)。

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

您可以轻松修复ReadTCP,以便它返回Taskasync void非常糟糕的做法!)然后使用它var response = await ReadTCP(); async ReadTCP 1}}方法,它会给你你想要的东西。

要在运行await的同时并行运行内容,请为该任务创建一个变量,然后为var readTask = ReadTCP(); DoOtherStuff(); AndMoreStuff(); AllAtOnce(); var response = await readTask; DoSomethingWith(response); 创建一个变量:

Task.Run

顺便说一句,您不必在Task.Run(() => FPXreaderTCP.ReadToEndAsync());中包装异步方法。不要执行:await FPXreaderTCP.ReadToEndAsync(),而只需执行function display(timesToLoop) { var tableRef = document.getElementById('myTable1').getElementsByTagName('tbody')[0]; var rowsAdd = tableRef.insertRow(); for (i = 0; i < timesToLoop; i++) { var newCell = rowsAdd.insertCell(); newCell.innerHTML = "<tr><td><input form ='forma' class= 'form-control input-sm' type='text' id = 'time' name= 'time' required> </td></tr><tr></tr>"; newCell.style.width = '70px'; newCell = rowsAdd.insertCell(); newCell.innerHTML = "<tr><td><input form ='forma' class= 'form-control input-sm' id = 'oraltype' name= 'oraltype' required></td></tr><tr></tr>"; newCell.style.width = '55px'; newCell = rowsAdd.insertCell(); newCell.innerHTML = "<tr><td><input form ='forma' class= 'form-control input-sm' type='text' id = 'oralamt' name= 'oralamt' required></td></tr>"; newCell.style.width = '75px'; newCell = rowsAdd.insertCell(); newCell.innerHTML = "<tr><td><input form ='forma' class= 'form-control input-sm' id = 'oralcommence' name= 'oralcommence' required></td></tr>"; newCell.style.width = '65px'; newCell = rowsAdd.insertCell(); newCell.innerHTML = "<tr><td><i class='fa fa-trash-o' style='font-size:20px' onclick='deleteRow(this)'></i></td></tr><tr></tr>"; newCell.style.width = '50px'; } }