У меня есть приложение, которое при каждом тике таймера, пытается запустить 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 - это делает то же самое ...
Что я делаю неправильно?
Насколько я могу судить, вы вызываете [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