如何线程/哪个线程用于后台DLing .NET

时间:2009-10-30 12:16:21

标签: c# .net winforms networking multithreading

我正在编写连接到数据库的前端应用程序,并下载指定项目所需的任何软件包。用户应该能够关闭不会启动任何更多DL的应用程序并等待当前完成,并强制关闭选项将断开当前下载并退出。

我正在下载的文件可能在几台不属于我自己的服务器上。我应该使用什么样的线程? IIRC在.NET上有一种以上的类型。我可以使用哪些命令告诉他们现在关闭(如果用户请求立即关闭,这可能会有所不同,然后终止)?

4 个答案:

答案 0 :(得分:3)

在给出的场景中,您应该能够使用HttpWebRequest / WebClient之类的异步性质,它将使用完成端口而不仅仅是线程来支持所有这些。

重新“立即杀死” - 除非你正在拆除你的过程,否则你不应该中止一个线程。这是一个坏事,可能会使系统处于损坏状态,或者处于无法恢复的锁定状态。然而,工具本身可能提供替代方案:

    WebClient wc = new WebClient();
    wc.DownloadFileCompleted += (sender, args) =>
    {
        if (args.Cancelled) Console.WriteLine("cancelled");
        else if (args.Error != null) Console.WriteLine(args.Error.Message);
        else Console.WriteLine("got it");
    };
    wc.DownloadFileAsync(uri, filePath);
    // wc.CancelAsync(); // to abort

请注意,在异步回调(上面的DownloadFileCompleted)中,你会在winforms / wpf之类的东西中切换到UI线程;例如:

    wc.DownloadFileCompleted += (sender, args) =>
    {
        this.Invoke((MethodInvoker) delegate {
            if (args.Cancelled) txtStatus.Text = "cancelled";
            else if (args.Error != null) txtStatus.Text = args.Error.Message;
            else txtStatus.Text = "got it";
        });
    };

答案 1 :(得分:1)

只有一种Thread,但有多种方法可以使用它们。由于您使用的是GUI(WinForms?),因此BackgroundWorker最适合。

您可以从那里使用异步或同步I / O.

你不应该中止()一个线程,但是关闭或取消你的连接。发表您想要使用的内容。

答案 2 :(得分:0)

您应该查看ThreadPool.QueueUserWorkItem

答案 3 :(得分:0)

如果您使用的是.NET 2或更高版本,请查看BackgroundWorker组件。