Я пытаюсь понять, что я могу и не могу сделать с фоновыми работниками.Я видел довольно много сообщений по этому вопросу, но все это, кажется, связано с какой-то операцией с циклами, и вы отменяете операцию внутри цикла.Я хочу выяснить, могу ли я отменить некоторую операцию с фоновым рабочим без цикла.
У меня есть следующая простая форма, с которой я играю:
, который содержит следующий код:
string[,] TestData = new string[300000, 100];
List<string> TestDataList;
private static Random random = new Random();
public Form1()
{
InitializeComponent();
// Loading up some fake data
for (int i = 0; i < 300000; i++)
{
for (int j = 0; j < 100; j++)
{
this.TestData[i, j] = RandomString(10) + j.ToString();
}
}
}
public static string RandomString(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)]).ToArray());
}
, который загружает массив строк с большим количеством фиктивных данных.Метод кнопки запуска выглядит следующим образом:
private void StartWork_Click(object sender, EventArgs e)
{
try
{
System.Threading.SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_Complete);
bw.RunWorkerAsync();
}
catch (Exception ex)
{
MessageBox.Show("Something went wrong.\nError:" + ex.Message);
}
}
И у меня также есть:
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
this.TestDataList = this.TestData.Cast<string>()
.Select((s, i) => new { GroupIndex = i / 100, Item = s.Trim().ToLower() })
.GroupBy(g => g.GroupIndex)
.Select(g => string.Join(",", g.Select(x => x.Item))).ToList();
}
private void bw_Complete(object sender, RunWorkerCompletedEventArgs e)
{
this.showWorkingLabel.Text = "Work done";
}
private void btnCancel_Click(object sender, EventArgs e)
{
// I want to cancel the work with this button
// Then show
this.showWorkingLabel.Text = "Work Cancelled";
}
Итак, вы заметите, что мой метод bw_DoWork
не содержит никаких циклов, а толькоодна операция, и я хочу знать, если:
- Если я могу убить / отменить фонового работника, нажав кнопку Отмена во время выполнения следующего кода:
.Select((s, i) => new { GroupIndex = i / 100, Item = s.Trim().ToLower() })
.GroupBy(g => g.GroupIndex)
.Select(g => string.Join(",", g.Select(x => x.Item))).ToList();
Могу ли я обновить метку
showWorkingLabel
во время фоновой работы, чтобы она постоянно отображала
".", "..", "..."
, а затем вернуться к
"."
, как индикатор выполнения, чтобы указать, что работа все еще продолжается