我正在编写连接到数据库的前端应用程序,并下载指定项目所需的任何软件包。用户应该能够关闭不会启动任何更多DL的应用程序并等待当前完成,并强制关闭选项将断开当前下载并退出。
我正在下载的文件可能在几台不属于我自己的服务器上。我应该使用什么样的线程? IIRC在.NET上有一种以上的类型。我可以使用哪些命令告诉他们现在关闭(如果用户请求立即关闭,这可能会有所不同,然后终止)?
答案 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组件。