[英]await a Task with a loop who await too
首先感謝您的閱讀。 我在這里是因為在我的一個項目中,我連續不斷地接收數據包,但是當我關閉我的應用程序時,我從我在ReceiveLoop中調用的ReceivePackets方法中得到了ObjectDisposedException,所以我就好了,我只是必須等到_receiveTask完成后才能關閉我的流和tcp客戶端,但是我的_receiveTask返回完成,甚至沒有到達方法的末尾。
我試過使用線程代替,但同樣的問題
開始任務
if (_receiveTask == null)
{
_receiveTask = Task.Run(new Action(ReceiveLoop));
}
循環執行任務
private async void ReceiveLoop()
{
while (_client.Connected && _run)
{
await ReceivePackets();
}
}
接收數據包任務
private async Task<List<Packet>> ReceivePackets()
{
var bytes = new byte[_client.ReceiveBufferSize];
int size = await _stream.ReadAsync(bytes, 0, bytes.Length);
List<Packet> packets = Decrypt(bytes, size).Select(p => new Packet(p)).ToList();
foreach (var packet in packets)
{
Dispatch(() => PacketReceived?.Invoke(packet));
}
return packets;
}
停止方式
public async Task Stop()
{
if (_client.Connected)
{
_run = false;
await _receiveTask;
_stream.Close();
_client.Close();
}
}
在Stop方法中,_receiveTask被視為已完成,但是當我在ReceiveLoop中的while循環之后放置一些內容時,甚至不會進行打印。
這是因為ReceiveLoop
實際上在所有代碼完成之前就“返回”了,就像大多數async
方法一樣。 您需要使其返回一個Task
,然后等待它,而不是根據該操作創建一個新Task
。
private async Task ReceiveLoop()
{
while (_client.Connected && _run)
{
await ReceivePackets();
}
}
...
_receiveTask = ReceiveLoop();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.