Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用一个循环等待一个任务谁也在等待_C#_Async Await - Fatal编程技术网

C# 用一个循环等待一个任务谁也在等待

C# 用一个循环等待一个任务谁也在等待,c#,async-await,C#,Async Await,首先感谢您的阅读。 我在这里是因为在我的一个项目中,我在一个循环中不断地接收数据包,但当我关闭我的应用程序时,我从我的ReceivePackets方法中得到一个ObjectDisposedException,该方法在ReceiveLoop中调用,所以我觉得ok,在关闭流和tcp客户端之前,我只需等待_receiveTask完成,但我的_receiveTask返回为已完成,甚至没有到达方法的结尾 我试着用一个线程来代替,但同样的问题 开始任务 if(\u receiveTask==null) {

首先感谢您的阅读。 我在这里是因为在我的一个项目中,我在一个循环中不断地接收数据包,但当我关闭我的应用程序时,我从我的ReceivePackets方法中得到一个ObjectDisposedException,该方法在ReceiveLoop中调用,所以我觉得ok,在关闭流和tcp客户端之前,我只需等待_receiveTask完成,但我的_receiveTask返回为已完成,甚至没有到达方法的结尾

我试着用一个线程来代替,但同样的问题

开始任务

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
相关