Witam,
ostatnio zacząłem się bawić z wielowątkowością, jednak natrafiłem na problem w momencie, gdy próbuję coś zrobić z obiektem głównego wątku (richtextbox) w innym wątku lub Task'u. W dodanym fragmencie, jest tworzona lista Task'ów, w których dodaję delegat na metodę, która ma za zadanie ustawienia właściwość TEXT na wygenerowany tekst o wielkości 10MB. Task'i z tego co zaobserwowałem działają prawidłowo, ponieważ richtextbox jest uzupełniany o tekst w losowej kolejność, a z tego co wiem, nad kolejnością task'ów nie można zapanować i są wykonywane losowo. Problem pojawia się w momencie, gdy klikam na button, wtedy aplikacja zamarza, na chwile, aż do momentu wygenerowania teksu. Liczyłbym na wyjaśnienie co robię źle, lub na potencjalne rozwiązanie tego problemu.
private void Generator_Click(object sender, EventArgs e)
{
List<Task> tasks = new List<Task>()
{
new Task(delegate
{
set(richTextBox1);
}),
new Task(delegate
{
set(richTextBox2);
}),
new Task(delegate
{
set(richTextBox3);
}),
new Task(delegate
{
set(richTextBox4);
}),
new Task(delegate
{
set(richTextBox5);
})
};
tasks.ForEach(x => x.Start());
}
private void set(RichTextBox richTextBox)
{
if (richTextBox.InvokeRequired)
richTextBox.Invoke(new Action(() => richTextBox.Text = GenerateText(10485760)));
else
richTextBox.Text = GenerateText(10485760);
}
private string GenerateText(int size)
{
var charSet = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";
var chars = charSet.ToCharArray();
var data = new byte[1];
var crypto = new RNGCryptoServiceProvider();
crypto.GetNonZeroBytes(data);
data = new byte[size];
crypto.GetNonZeroBytes(data);
var result = new StringBuilder(size);
foreach (var b in data)
{
result.Append(chars[b % (chars.Length)]);
}
return result.ToString();
}