2016-01-23 241 views
0

我有,在计时器的滴答每次,尝试运行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 - 这不相同......

我在做什么错?

+0

据我所见,你打电话[NetworkStream.CopyTo()](http://stackoverflow.com/a/11749522/477878),而不是MemoryStream.CopyTo()...? –

+0

@JoachimIsaksson是的,这是正确的。 NetworkStream有我的数据 - 它是TCPClient.NetworkStream。我想从networkStream复制到memoryStream中,就像在这里完成的一样:http://stackoverflow.com/questions/19387979/get-length-of-data-available-in-networkstream – pookie

+1

如果重复未回答您的问题问题请重新打开。就我所知,这是同样的问题。 – usr

回答

1

可能您需要使用此方法的异步等效。尝试使用stream.CopyToAsync(memoryStream);而不是stream.CopyTo(memoryStream);.这将返回一个可以在完成时继续的任务,如下所示:await input.CopyToAsync(output)。