Как нить / какой поток использовать для фона DLing .NET - PullRequest
1 голос
/ 30 октября 2009

Я пишу интерфейсное приложение, которое подключается к БД и загружает любой пакет, необходимый для указанного проекта. Пользователь должен иметь возможность закрыть приложение, которое больше не будет запускать DL, и дождаться окончания текущего и возможность принудительного закрытия, что приведет к отключению текущей загрузки и выхода.

Файлы, которые я загружаю, могут находиться на нескольких серверах, которые не принадлежат мне. Какие темы я должен использовать? IIRC было более одного типа на .NET. Какие команды я могу использовать, чтобы сказать им закрыть сейчас (это может отличаться, а затем завершиться) в случае, если пользовательский запрос завершит работу сразу же?

Ответы [ 4 ]

3 голосов
/ 30 октября 2009

В данном сценарии вы должны быть в состоянии использовать асинхронную природу таких вещей, как 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";
        });
    };
1 голос
/ 30 октября 2009

Существует только 1 вид потоков, но существует множество способов их использования. Поскольку вы работаете с графическим интерфейсом (WinForms?), BackgroundWorker является наиболее подходящим.

Вы можете использовать асинхронный или синхронизированный ввод / вывод оттуда.

Вы не должны прерывать () поток, а закрывать или отменять соединение. Зависит от того, что вы хотите использовать.

0 голосов
/ 30 октября 2009

Посмотрите на BackgroundWorker , если вы используете .NET 2 или новее.

0 голосов
/ 30 октября 2009

Вы, вероятно, должны заглянуть в ThreadPool.QueueUserWorkItem

...