【问题标题】:access list element from thread从线程访问列表元素
【发布时间】:2010-03-18 09:49:00
【问题描述】:

我在主应用程序中有一个“列表”,我试图从一个线程中访问它的元素。我得到了这个例外: {“调用线程无法访问此对象,因为不同的线程拥有它。”} System.SystemException {System.InvalidOperationException}

【问题讨论】:

    标签: c# wpf list multithreading


    【解决方案1】:
    DispatcherOperation d = myListBox.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => 
    { 
        // access your listbox and return something
    })); 
    

    然后要求您的 DispatcherOperation 获取返回值

    myValue = d.Result; //Result is of type Object
    

    【讨论】:

    • 感谢您的解决方案。我的列表是 List,当我尝试使用您的方法获取第 n 个元素时,应用程序会冻结。
    • 在这种情况下,像这样复制 UI 调度程序。调度程序 UIdispatcher = Dispatcher.CurrentDispatcher;在你开始你的线程之前。现在在你的线程而不是 myListBox.Dispatcher 中使用 UIdispatcher.Invoke(...) 你能告诉我你是如何调用 Invoke 方法的吗?我的意思是你的代码。
    • 使用 Invoke 而不是 BeginInvoke。将 d.Result 转换为所需的类型
    【解决方案2】:

    您可以通过声明委托来使用跨线程。

    private delegate void thread_delegate();
    

    然后创建一个方法并放置所有访问您列表的方法。

    private void SampleMethod()
    {
    ....
    }
    

    然后为您的线程创建一个方法。 在该方法中调用您的方法 whick

    private void ThreadMethod()
    {
    
               thread_delegate d = new thread_delegate(SampleMethod);
                d.Invoke();
    }
    

    在您创建线程的声明中...

     Thread t = new Thread(new ThreadStart(ThreadMethod));    
     t.Start();
    

    【讨论】:

    • 我已经尝试过这种方法,但它不起作用。我得到了同样的例外
    【解决方案3】:

    【讨论】:

    • 谢谢,但我可以为列表成员设置一个值。我不知道如何使用调度程序检索它的值。
    【解决方案4】:

    试试这个。
    MylistBox 是一个 ListBox

    namespace TEST
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Thread th = new Thread(AccessList);
                th.Start(MylistBox);
            }
    
            void AccessList(Object O)
            {
                ListBox lBox = O as ListBox;
                for (int i = 0; i < lBox.Items.Count; i++)
                {
                    MessageBox.Show(lBox.Items[i].ToString());
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多