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);
,它可以工作,但我不想定义缓冲区大小,因为我事先不知道数据包会有多大。
我环顾四周并尝试了几种方法,包括以下帖子中的一种方法:从流中读取数据的最有效方法 - 这样做是一样的......
我做错了什么?
可能需要使用此方法的异步等效物。尝试使用流。CopyToAsync(memoryStream);而不是流。CopyTo(memoryStream);.这将返回一个任务,完成后可以继续,如下所示:等待输入。复制到异步(输出)。