关闭已在运行的线程中的流[C#]

时间:2010-01-15 20:54:14

标签: c# multithreading stream

我在线程中运行了多次下载。我想关闭流,比如当用户点击暂停/停止下载时。我如何关闭在线程中运行的下载的文件流?

6 个答案:

答案 0 :(得分:6)

stream.Close();

答案 1 :(得分:4)

您可以在共享内存中使用一个标志,并定期从线程中检查它,以确定是开始等待(或关闭流)还是下载下一个块。

答案 2 :(得分:1)

你能做到的一种方法是在一个循环中的一个线程内传输缓冲区。每次您要抓取另一块数据时,请检查您的暂停属性是否已启用。如果有,只需跳过迭代,直到它被设置回true。

这样,您的流不会被关闭,但会暂停下载任何其他数据。

答案 3 :(得分:0)

您可以拥有一个事件对象(MaunalResetEvent \ AutoResetEvent)。需要停止线程时发出事件信号。在您的线程例程中检查事件是否已发出信号并停止处理以及关闭文件流。

答案 4 :(得分:0)

您可以使用后台工作线程并使用内置的取消事件,而不是调用thread.Abort()

您致电worker.CancelAsync()举起活动。例如,这可以来自按钮或按键。

然后在worker_DoWork方法中,您有以下内容:

if (worker.CancellationPending)
{
    // close the stream
}
else
{
    // Carry on downloading
}

在你正在执行下载的循环中

答案 5 :(得分:0)

这会有用吗?只是一个建议,我对线程不是很热。保持处理下载的类,这会有效吗?

    public class Threader
        {
            MyDownloader md;

            public void UserClicksDownload()
            {
                md = new MyDownloader();
                Thread t = new Thread(md.DownloadStuff);            
                t.Start();

                Thread.Sleep(100);
            }

            public void UserClicksStop()
            {
                t.Abort();
                t = null;
                md.StopDownloading();
            }
        }

        public class MyDownloader 
        {
            public void DownloadStuff()
            {
                while (true)
                {
                    Console.WriteLine("downloading stuff!");
                }
            }

            public void StopDownloading()
            {
                Console.WriteLine("Tidy up you downloads here");
            }
        }