有一个Tcp客户端类,我的想法很简单:连接服务器,异步启动监听服务器消息的方法。当我运行 ReadStream 方法时,我特别不指定 await 以免等待它完成,但是,仍然没有发生异步。
class Client : IDisposable
{
...
public async Task ConnectAsync(string host, int port)
{
await tcpClient.ConnectAsync(IPAddress.Parse(host), port);
if (tcpClient.Connected)
{
System.Console.WriteLine("Connected!");
var task = ReadStream(token);
activeTasks.Add(task);
System.Console.WriteLine("Task runned");
}
else
{
System.Console.WriteLine("Failed to connect :(");
}
}
...
private async Task<string> ReadStringFromStreamAsync(NetworkStream stream, int size)
{
var buffer = new byte[size];
int length = await stream.ReadAsync(buffer, 0, buffer.Length);
return Encoding.UTF8.GetString(buffer, 0, length);
}
private async Task ReadStream(CancellationToken token)
{
var stream = tcpClient.GetStream();
while (!token.IsCancellationRequested)
{
if (stream.DataAvailable)
{
string message = await ReadStringFromStreamAsync(stream, 1024);
System.Console.WriteLine("Recieved message: " + message);
}
}
}
}
如果我通过 运行该方法Task.Run(()=>ReadStream(token))
,那么一切都会按我的需要进行。这对我来说有点奇怪,因为我的方法也会返回Task
,并且根据我的逻辑(很可能是不正确的),当遇到意外时,Task
该方法应该异步运行。在所有的培训时间里,我已经对这个话题进行了 3 次深入研究,但仍然对这种机制的功能的想法非常薄弱。因此,如果在解决此问题的示例中某些部分能达到我的要求,那就太好了。因此,我有两个问题:
为什么
ReadStream
尽管存在该方法但没有异步启动该方法await
(通常没有说明由于它不存在该方法是同步执行的)?如果通过 异步运行这个操作仍然是正确的
Task.Run
,那么我对应该将哪个任务放在活动任务列表中有点困惑:var task = Task.Run(()=>ReadStream(token)); activeTasks.Add(task);
或者
Task.Run(()=>{var task = ReadStream(token); activeTasks.Add(task);});