хорошо, после борьбы с этим я наконец нашел эффективное и простое решение для этого ..
мне потребовалась только хеш-таблица, которая содержит признаки выбранных элементов в списке и простое значение bool.индекс - это ключ, а bool (true, false) - это значение.значение bool похоже на (вкл / выкл) переключатель, указывающий, что текущий цикл отменен или нет .. поэтому, чтобы просто прервать конкретный поток, мне нужно передать ключ (индекс) выбранного элемента в моем списке просмотраЦикл foreach и проверьте, включен ли переключатель bool, и это в основном все ...
, поэтому мой окончательный код будет таким:
//I declared the hashtable outside the function so I can manage it from different source.
private Hashtable abortingItem;
Теперь, когда я нажимаю кнопку захвата, этодолжен заполнить хеш-таблицу выбранными признаками ...
abortingItem = new Hashtable();
for (int i = 0; i < myURLslist.SelectedItems.Count(); i++)
{
//false means don't abort this.. let it run
abortingItem.Add(myURLslist.SelectedItems[i].index, false);
}
//here should be the code of my thread to run the process of grabbing the URLs (the foreach loop)
//..........................
Теперь, если мне нужно отменить определенный элемент, все, что мне нужно, это выбрать элемент в списке и нажать кнопку отмены
private void abort_Click(object sender, EventArgs e)
{
if (abortingItem != null)
{
for (int u = 0; u < myURLslist.SelectedIndices.Count; u++)
{
//true means abort this item
abortingItem[myURLslist.SelectedIndices[u]] = true;
}
}
}
В моем цикле foreach все, что мне нужно, это простой оператор if, чтобы проверить, включен или выключен bool:
//List<int> currentWorkingItem //contains the indices of the items in listview
//List<string> URLsList //contains the URLs of the items in listview
Parallel.ForEach(URLsList, new ParallelOptions() { MaxDegreeOfParallelism = 5 }, (url, i, j) =>
{
//aborting
if (!(bool)abortingItem[currentWorkingItem[(int)j]])
{
//show to user this link is currently being downloaded by highlighting the item to green...
this.BeginInvoke((Action)(delegate()
{
//current working item
mylistview.Items[currentWorkingItem[(int)j]].BackColor = green;
}));
//here I download the contents of every link in the list...
string HtmlResponse = GetPageResponse(url);
//do further processing....
}
else
{
//aborted
}
});
Это просто все.