Отмена задачи, которая извлекает URL-адреса асинхронно

У меня небольшая проблема с поиском того, как отменить эту задачу на C#. Я не очень хорошо разбираюсь в работе с потоками и пытался найти в Googlе несколько простых примеров кода, чтобы помочь мне, но я ни к чему не пришел. Вот кусок кода, над которым я работаю:

var tasks = urls.Select(url => Task.Factory.StartNew(
state =>
{
    using (var client = new WebClient())
    {

        lock (this)
        {

        // code to download stuff from URL

        }

    }
}, url)).ToArray();

    try
    {
       Task.WaitAll(tasks);
    }
    catch (Exception e)
    {
      textBox2.AppendText("Error: " + e.ToString());
    }

Где "urls" - массив URL. Есть ли простой способ сделать так, чтобы при нажатии на кнопку в моей программе загрузка URL полностью останавливалась? Кроме того, фрагмент кода, который я вставил, находится в функции, которую вызывает backgroundWorker1, что, я полагаю, может немного усложнить ситуацию. (Причина, по которой у меня есть backgroundWorker, заключается в том, что пользовательский интерфейс не блокируется во время загрузки URL)

Если это как-то смущает, вот схема того, чего я пытался достичь с помощью моего кода:

  • У меня есть массив URL, я хотел бы загрузить каждый URL асинхронно, не блокируя пользовательский интерфейс.
  • Желательно, чтобы пользователь мог остановить программу от загрузки URL, нажав на кнопку, что практически отменяет поток.
  • Когда пользователь снова нажимает на кнопку, программа заново загружает URL из этого массива.

Заранее спасибо.

7
задан M.Babcock 31 January 2012 в 04:37
поделиться