我有一个应用程序,在计时器的每个刻度处,尝试运行backgroundWorker:
private void Timer_Tick(object sender, EventArgs e)
{
if (!UpdateImageViewerBackgroundWorker.IsBusy)
{
UpdateImageViewerBackgroundWorker.RunWorkerAsync();
}
}
调用RunWorkerAsync()时,此函数执行: private void UpdateImageViewerBackgroundWorker_DoWork(object sender,
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);
导致我的backgroundWorker死锁,导致UpdateImageViewerBackgroundWorker.IsBusy
始终为true
。
如果我在using语句中添加一个断点并观察它,一旦它到达stream.CopyTo(memoryStream);
,它就会跳过,并且IsBusy
总是{{1}再也不会再次触发该函数} ...
如果我定义一个具有固定大小的缓冲区,然后执行true
,它会起作用,但我不想定义缓冲区大小,因为我事先并不知道数据包的大小。< / p>
我环顾四周并尝试了一些方法,包括以下帖子中的方法:in action in this boilerplate - 这也是一样......
我做错了什么?
答案 0 :(得分:1)
可能你需要使用异步等效的这种方法。尝试使用stream.CopyToAsync(memoryStream);而不是stream.CopyTo(memoryStream);.这将返回一个可在完成时继续执行的任务,如下所示:await input.CopyToAsync(output)。