Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭已在运行[C#]的线程中的流_C#_Multithreading_Stream - Fatal编程技术网

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

关闭已在运行[C#]的线程中的流,c#,multithreading,stream,C#,Multithreading,Stream,我有多个线程运行的下载。我想关闭流,比如当用户点击暂停/停止下载。如何关闭在线程中运行的下载文件流?您可以在共享内存中使用一个标志,并定期从线程中检查它,以确定是开始等待(或关闭流)还是下载下一个块。一种方法是在循环中的线程中对缓冲区进行流式处理。每次要获取另一块数据时,请检查是否已启用“暂停”属性。如果有,只需跳过迭代,直到它被设置回true stream.Close(); 这样,您的流不会关闭,但会暂停下载任何其他数据。您可以拥有一个事件对象(MaunalResetEvent\AutoRe

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

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

一种方法是在循环中的线程中对缓冲区进行流式处理。每次要获取另一块数据时,请检查是否已启用“暂停”属性。如果有,只需跳过迭代,直到它被设置回true

stream.Close();

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

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

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

调用
worker.CancelAsync()
来引发事件。例如,这可能来自按钮或按键

然后在
worker\u DoWork
方法中,您有以下内容:

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

在执行下载的循环中,这是否可行?只是一个建议,我不是超级热线程。保留处理下载的类,这样行吗

    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");
            }
        }

你能给我一个更简洁的答案吗?我认为它不能变得更简洁。把小溪关上。什么阻止了您?Thread.Abort是一个核心选项,应该在正常处理中避免(例如用户“暂停”或“取消”操作)。有关问题和备选方案的讨论,请参阅。您能告诉我们是什么阻止您关闭正在使用流的线程中的流吗?