C# 用一个循环等待一个任务谁也在等待
首先感谢您的阅读。 我在这里是因为在我的一个项目中,我在一个循环中不断地接收数据包,但当我关闭我的应用程序时,我从我的ReceivePackets方法中得到一个ObjectDisposedException,该方法在ReceiveLoop中调用,所以我觉得ok,在关闭流和tcp客户端之前,我只需等待_receiveTask完成,但我的_receiveTask返回为已完成,甚至没有到达方法的结尾 我试着用一个线程来代替,但同样的问题 开始任务C# 用一个循环等待一个任务谁也在等待,c#,async-await,C#,Async Await,首先感谢您的阅读。 我在这里是因为在我的一个项目中,我在一个循环中不断地接收数据包,但当我关闭我的应用程序时,我从我的ReceivePackets方法中得到一个ObjectDisposedException,该方法在ReceiveLoop中调用,所以我觉得ok,在关闭流和tcp客户端之前,我只需等待_receiveTask完成,但我的_receiveTask返回为已完成,甚至没有到达方法的结尾 我试着用一个线程来代替,但同样的问题 开始任务 if(\u receiveTask==null) {
if(\u receiveTask==null)
{
_receiveTask=Task.Run(新操作(ReceiveLoop));
}
任务中的循环
private async void ReceiveLoop()
{
while(_client.Connected&&u run)
{
等待接收数据包();
}
}
接收数据包任务
private async Task ReceivePackets()
{
var bytes=新字节[_client.ReceiveBufferSize];
int size=wait_stream.ReadAsync(字节,0,字节.长度);
列表数据包=解密(字节,大小)。选择(p=>newpacket(p)).ToList();
foreach(数据包中的var数据包)
{
分派(()=>PacketReceived?.Invoke(packet));
}
返回数据包;
}
使用的停止方法
公共异步任务停止()
{
如果(_client.Connected)
{
_运行=错误;
等待接收任务;
_stream.Close();
_client.Close();
}
}
在Stop方法中,接收任务被视为已完成,但当我在接收循环中的while循环之后放置打印内容时,它甚至没有被打印。这是因为
ReceiveLoop
实际上在其所有代码完成之前“返回”,就像大多数异步方法一样。您需要让它返回一个任务
,然后等待它,而不是基于该操作创建一个新的任务
private async Task ReceiveLoop()
{
while (_client.Connected && _run)
{
await ReceivePackets();
}
}
这是因为ReceiveLoop
实际上在其所有代码完成之前“返回”,就像大多数async
方法一样。您需要让它返回一个任务
,然后等待它,而不是基于该操作创建一个新的任务
private async Task ReceiveLoop()
{
while (_client.Connected && _run)
{
await ReceivePackets();
}
}
避免使用async void
,还应阅读CancellationToken
,因为它们与Task
相关,避免使用async void
,还应阅读CancellationToken
,因为它们与Task
相关