В данном сценарии вы должны быть в состоянии использовать асинхронную природу таких вещей, как HttpWebRequest
/ WebClient
, которая уже будет поддерживать все это, используя порты завершения, а не только потоки.
Re "kill now" - вам никогда не следует прерывать поток, если вы не прерываете свой процесс. Это плохая вещь , и может привести систему в поврежденное состояние или с неисправимыми блокировками. Однако сам инструмент может предложить альтернативы:
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, вам придется переключаться на поток пользовательского интерфейса; например:
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";
});
};