我是多线程新手,我有一个关于同时使用线程和等待/异步的简单问题。我有一个方法,它读取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
}
}
编辑的代码
答案 0 :(得分:2)
手动创建和操作线程是一种先进的多线程技术,需要开发人员真正知道他正在做什么(因为线程之间的内存防护,同步和编组都是认真的高级主题,容易搞砸)。线程安全很难。
如果您只想提高应用的响应能力,那么几年前添加到.NET的异步和等待结构就非常完美。它们不一定与多线程有关,因为它是决定是否创建新线程的基础机制(并且并非总是如此)。
您正在做的是创建一个线程并在该线程上运行ReadTCP
方法。
您可以轻松修复ReadTCP
,以便它返回Task
(async 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';
}
}
。