MemoryStream.CopyTo()导致线程死锁

时间:2016-01-23 19:19:00

标签: c# tcp tcpclient memorystream

我有一个应用程序,在计时器的每个刻度处,尝试运行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 - 这也是一样......

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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