MemoryStream.CopyTo() 导致线程死锁

本文关键字:线程 死锁 CopyTo MemoryStream | 更新日期: 2023-09-27 18:31:32

我有一个应用程序,在计时器的每个刻度,都会尝试运行后台工作线程:

private void Timer_Tick(object sender, EventArgs e)
{
    if (!UpdateImageViewerBackgroundWorker.IsBusy)
    {
        UpdateImageViewerBackgroundWorker.RunWorkerAsync();
    }
}

当调用 RunWorkerAsync() 时,此函数将执行:私有无效UpdateImageViewerBackgroundWorker_DoWork(对象发送方,

private void UpdateImageViewerBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var connected = tcp.IsConnected();
    if (connected)
    {
        var stream = tcp.NetworkStream;
        using (var memoryStream = new MemoryStream())
        {
            byte[] buffer;
            stream.CopyTo(memoryStream);
            buffer = memoryStream.ToArray();
            ....
        }
    }
    else
    {
        tcp.Connect();
    }
}

问题是stream.CopyTo(memoryStream);会导致我的后台工作者死锁,导致我的UpdateImageViewerBackgroundWorker.IsBusy始终true

如果我在 using 语句中添加一个断点并观察它,一旦它命中该stream.CopyTo(memoryStream);,它就会跳过,并且该函数永远不会再次命中,IsBusy总是true......

如果我定义一个固定大小的缓冲区,然后执行stream.Read(buffer, 0, BYTES_TO_READ);,它可以工作,但我不想定义缓冲区大小,因为我事先不知道数据包会有多大。

我环顾四周并尝试了几种方法,包括以下帖子中的一种方法:从流中读取数据的最有效方法 - 这样做是一样的......

我做错了什么?

MemoryStream.CopyTo() 导致线程死锁

可能需要使用此方法的异步等效物。尝试使用流。CopyToAsync(memoryStream);而不是流。CopyTo(memoryStream);.这将返回一个任务,完成后可以继续,如下所示:等待输入。复制到异步(输出)。