`

调用线程无法访问此对象,因为另一个线程拥有该对象(转)

 
阅读更多
WPF:Dispatcher.Invoke 方法,只有在其上创建 Dispatcher 的线程才可以直接访问DispatcherObject。若要从不同于在其上创建 DispatcherObject 的线程的某个线程访问 DispatcherObject,请对与 DispatcherObject 关联的 Dispatcher 调用 Invoke 或 BeginInvoke。需要强制线程安全的 DispatcherObject 的子类可以通过对所有公共方法调用 VerifyAccess 来强制线程安全。这样可以保证调用线程是在其上创建 DispatcherObject 的线程。
  代码:
  this.lbl.Dispatcher.Invoke(new Action(()=>{ this.lbl.Text = "this is a test!!!"; }));
     this.lbl.Dispatcher.Invoke(new Action(()=>{ this.lbl.Text = "this is a test!!!"; }));
Winfrom:Control.Invoke 方法 (Delegate),在拥有此控件的基础窗口句柄的线程上执行指定的委托。
  代码:
          this.lbl.Invoke(new Action(()=>{ this.lbl.Text = "this is a test!!!"; }));  

public void theout(object source, System.Timers.ElapsedEventArgs e)  
     {  
         this.gcc1.Dispatcher.Invoke(  
            new Action(  
                 delegate  
                 {  
                     if (this.gcc1.Offset < 1)  
                     {  
                         this.gcc1.Offset += 0.1;  
                     }  
                     else  
                     {  
                         this.gcc1.Offset = 0;  
                     }  
                 }  
            )  
      );  
         this.gcc2.Dispatcher.Invoke(  
                new Action(  
                     delegate  
                     {  
                         if (this.gcc2.Offset < 1)  
                         {  
                             this.gcc2.Offset += 0.1;  
                         }  
                         else  
                         {  
                             this.gcc2.Offset = 0;  
                         }  
                     }  
                )  
          );   
     }  
分享到:
评论

相关推荐

    C++11/14 线程调用类对象和线程传参的方法

    线程调用类对象 在前面的示例中,我们为线程任务使用了通常的函数。实际上,我们可以使用任何可调用对象或者lambda函数,如下调用类对象的例子: #include #include class MyFunctor { public: void operator()...

    STA客户跨线程调用STA对象

    当一个MTA线程想要调用STA对象时,它不能直接调用,因为这可能会违反STA线程的单线程访问规则。相反,MTA线程需要通过发送一个消息到STA线程的消息队列来请求服务,然后由STA线程的消息循环处理这个请求,调用适当的...

    线程异步工作,当一个线程结束时异步通知另一线程

    在多线程编程中,线程间的协作是关键任务之一,尤其当需要一个线程在完成特定工作后通知另一个线程继续执行时。这个过程通常涉及到线程同步和异步的概念。本文将深入探讨线程异步工作以及如何在C++中实现一个线程在...

    浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    如果在调试器中运行应用程序时,如果一个不是创建某个控件的线程的其他线程调用该控件,那么调试器会引发一个InvalidOperationException,并显示以下消息:“从不是创建控件控件名称 的线程访问它。” 在C#中跨线程...

    C# 跨线程访问UI线程控件

    在C#中,由于使用线程和调用UI的线程属于两个不同的线程,如果在线程中直接设置UI元素的属性,此时就会出现跨线程错误。    下面介绍两种解决方案  第一种:使用控件自带的Invoke或者BeginInvoke方法。 Task....

    MTA客户跨线程调用STA对象

    本文将深入探讨MTA客户端如何跨线程调用STA对象,并通过一个简单的实例来演示这一过程。 首先,我们需要理解MTA和STA的区别。MTA是多线程公寓模型,允许同一公寓内的多个线程并行执行,而STA则是单线程公寓模型,...

    delphi多线程调用dll

    例如,如果DLL提供了一个名为`MyFunction`的导出函数,我们首先需要声明一个与该函数匹配的函数原型,然后使用GetProcAddress获取函数指针,最后通过指针调用函数: ```delphi type TMyFunction = function(param1...

    VC++调用大漠插件多线程运行模版

    6. **异常处理**:在多线程环境中,异常处理尤为重要,因为一个线程的异常可能会导致其他线程的崩溃。正确地捕获和处理异常可以提高程序的健壮性。 7. **资源管理**:线程可能需要访问共享资源,如数据库连接、网络...

    易语言线程调用源码,易语言线程调用易包演示

    线程调用是编程中一个核心概念,特别是在并发编程中。在易语言中,创建和管理线程可以使得程序能够同时执行不同的操作,而不是按照顺序依次执行。这在需要处理大量数据或进行复杂计算时特别有用,因为线程可以并行...

    COM多线程访问演示

    在MTA中,线程安全需要程序员自己来保证,因为多个线程可能会同时调用同一个对象。 线程同步是多线程编程中的关键概念,它确保在特定时间只有一个线程可以访问共享资源,防止数据竞争和死锁。在COM中,可以使用各种...

    线程间的调用

    在编程领域,线程间的调用是多线程编程中的一个重要概念。线程是操作系统分配处理器时间的基本单元,它使得程序能够同时执行多个任务。在本文中,我们将深入探讨线程的创建、通信、同步以及如何使用特定的线程操作如...

    易语言线程互斥对象解决

    线程互斥对象是一种同步机制,当一个线程获得了Mutex的所有权后,其他试图获取该Mutex的线程将被阻塞,直到拥有Mutex的线程释放它。在易语言中,可以使用相关函数或者对象来创建和管理Mutex,确保在多线程环境中,...

    多线程事件对象通讯

    - 线程启动信号:一个线程创建另一个线程后,可以使用事件对象通知新线程已经开始运行。 - 数据准备就绪:当数据准备好供另一个线程处理时,可以设置事件对象,让处理线程知道数据已准备好。 - 锁定资源:线程...

    jni中用多线程调用java代码

    例如,你可以创建一个方法来启动一个新的线程,并传入一个回调函数,这个函数将在新线程中被调用。 2. **生成JNI头文件**:使用`javah`工具(或者在Android Studio中自动完成)根据你的Java类生成对应的C/C++头文件...

    线程同步机制解决多线程资源访问冲突

    事件对象是Windows API提供的一种线程同步机制,它允许一个线程等待另一个线程的特定操作完成。事件对象有两类:人工重置事件(Manual Reset Event)和自动重置事件(Auto Reset Event)。 1. **人工重置事件**:当...

    c#跨线程跨类调用窗体控件

    标题提到的“c#跨线程跨类调用窗体控件”是指在一个线程(非UI线程)中,通过另一个类来操作属于UI线程的窗体控件,比如`Form1`中的`ListBox1`。以下将详细阐述这个主题。 首先,理解C#中的线程概念是至关重要的。...

    MFC两个线程中用事件内核对象通信

    在这个实例中,线程可能会调用这个函数来阻塞自己,直到另一个线程通过调用`SetEvent`函数设置事件对象的状态。 5. **事件对象的创建与使用**:在MFC中,可以使用`CreateEvent`函数创建一个事件对象,并指定其初始...

    C#跨线程调用控件的四种方式(调用实例源码)

    它可以在后台线程上运行一个操作,并通过事件回调更新UI。 ```csharp private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // 后台工作 } private void backgroundWorker1_...

    c++ 面向对象多线程编程

    `std::promise`创建一个未来值,可以在一个线程中设置,然后在另一个线程中获取。 4. 线程局部存储:使用`std::thread_local`关键字,可以在每个线程中存储私有数据,即使在多个线程中使用同一函数,也不会互相干扰...

Global site tag (gtag.js) - Google Analytics