簡體   English   中英

用循環等待任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM