我正在尝试启动一个新线程,该线程对多个列表进行排序,然后将富文本框中的数据设置为排序时经过的时间。
我的代码是:
delegate void TextCallback(string data);
private void button1_Click(object sender, EventArgs e)
{
List<List<int>> data = new List<List<int>>();
for(int i = 0; i < 8; i++)
{
data.Add(new List<int>());
}
Random rand = new Random();
for(int j = 0; j < 1000000; j++)
{
foreach(var l in data)
{
l.Add(rand.Next(0, 10000));
}
}
Thread singleThreaded = new Thread(() => doSortOnMultiList(data));
singleThreaded.Start();
}
private void doSortOnMultiList(List<List<int>> lists)
{
Stopwatch s = new Stopwatch();
s.Start();
foreach(var list in lists)
{
list.Sort();
}
s.Stop();
//SetTextBox2(richTextBox2.Text + "Single-Threaded sort: " + s.Elapsed.Milliseconds);
SetTextBox2("Single-Threaded sort: " + s.Elapsed.Milliseconds + "ms." + System.Environment.NewLine);
}
private void SetTextBox2(string data)
{
if (richTextBox2.InvokeRequired)
{
Invoke(new TextCallback(SetTextBox2), new object[] { data });
}
else
//richTextBox2.Text = data;
richTextBox2.Append(data);
}我正在使用msdn文档,它说上面的方法是线程安全的,并允许我的程序在我的线程中设置文本。然而,情况并非如此,因为我正在收到以下错误:
跨线程操作无效:控件'richTextBox2‘
在我的实现中唯一不同的地方(据我所见)是,我用lambda启动线程,以便能够传递我的列表。我不能在线程中掌握一些概念,所以任何帮助都将受到感谢。
下面是当前使用的MSDN资源im:MSDN
编辑:我修正了上面的代码,旧的行被注释掉了,以向后面的任何人展示它的不同之处。
发布于 2015-11-19 04:29:28
你在一个单独的线程上调用了doSortOnMultiList(),
Thread singleThreaded = new Thread(() => doSortOnMultiList(data));
singleThreaded.Start();在这个doSortOnMultiList()中,有
SetTextBox2(richTextBox2.Text + "Single-Threaded sort: " + s.Elapsed.Milliseconds);在这条线内,有
richTextBox2.Text因此,基本上,您是从一个非UI线程访问UI组件richTextBox2,这将导致此错误。
https://stackoverflow.com/questions/33795119
复制相似问题