我有,在计时器的滴答每次,尝试运行BackgroundWorker的应用程序:MemoryStream.CopyTo()导致线程死锁
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);
引起我的BackgroundWorker的死锁,导致我UpdateImageViewerBackgroundWorker.IsBusy
总是被true
。
如果我添加一个断点using语句,看着它,只要在击中stream.CopyTo(memoryStream);
,它在步和功能不会与IsBusy
总是true
再次袭来......
它的工作原理,如果我定义了一个固定大小的缓冲区,然后执行stream.Read(buffer, 0, BYTES_TO_READ);
,但我不想定义缓冲区大小,因为我事先不知道数据包有多大。
我环顾四周,并尝试了一些方法,包括一个在下面的帖子:Most efficient way of reading data from a stream - 这不相同......
我在做什么错?
据我所见,你打电话[NetworkStream.CopyTo()](http://stackoverflow.com/a/11749522/477878),而不是MemoryStream.CopyTo()...? –
@JoachimIsaksson是的,这是正确的。 NetworkStream有我的数据 - 它是TCPClient.NetworkStream。我想从networkStream复制到memoryStream中,就像在这里完成的一样:http://stackoverflow.com/questions/19387979/get-length-of-data-available-in-networkstream – pookie
如果重复未回答您的问题问题请重新打开。就我所知,这是同样的问题。 – usr