首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对带有参数的函数进行线程安全调用

对带有参数的函数进行线程安全调用
EN

Stack Overflow用户
提问于 2015-11-19 04:10:35
回答 1查看 77关注 0票数 0

我正在尝试启动一个新线程,该线程对多个列表进行排序,然后将富文本框中的数据设置为排序时经过的时间。

我的代码是:

代码语言:javascript
复制
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

编辑:我修正了上面的代码,旧的行被注释掉了,以向后面的任何人展示它的不同之处。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-19 04:29:28

你在一个单独的线程上调用了doSortOnMultiList()

代码语言:javascript
复制
Thread singleThreaded = new Thread(() => doSortOnMultiList(data));
singleThreaded.Start();

在这个doSortOnMultiList()中,有

代码语言:javascript
复制
SetTextBox2(richTextBox2.Text + "Single-Threaded sort: " + s.Elapsed.Milliseconds);

在这条线内,有

代码语言:javascript
复制
richTextBox2.Text

因此,基本上,您是从一个非UI线程访问UI组件richTextBox2,这将导致此错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33795119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档