2016-01-23 2 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.

Если добавить точку останова в использовании заявления и смотреть его, как только он попадает, что 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) ;. Это вернет задачу, которая может быть продолжена, когда она будет завершена, например: wait.CopyToAsync (вывод).

Смежные вопросы