- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个类可以处理由多个成员对象创建的事件。来自这些对象的事件为该事件生成工作线程,以便我类中的各种事件处理程序在不同的线程上运行(一个是串行处理程序,一个是计时器事件,等等)我正在寻找一种简单的方法来使我的代码线程安全,最好是通过强制事件处理程序在我的对象的线程上运行。
如果这是一个 Forms UI 对象,我可以利用它对 ISynchronizeInvoke
接口(interface)的实现,并调用 InvokeRequired
、Invoke
等。在 WPF 中,我可以使用 Dispatcher
对象。但是我的类需要*独立于任何 UI 代码运行。
这是我所拥有的一个简化示例:
public class MyClass
{
private SomeObject object1;
private AnotherObject object2;
public MyClass()
{
object1 = new SomeObject();
object2 = new AnotherObject();
object1.AThreadedEvent += ThreadedEventHandler1;
object2.AnotherThreadedEvent += ThreadedEventHandler2;
}
// This runs in its own thread!
private void ThreadedEventHandler1()
{
// DO STUFF HERE
}
// This runs in its own thread!
private void ThreadedEventHandler2()
{
// DO STUFF HERE
}
}
因为两个事件处理程序访问父类中的相同对象(包括彼此!),如果有一种简单的方法强制事件处理程序在创建对象的线程中运行,那就太棒了。
我曾考虑过让我的类实现 ISynchronizeInvoke
接口(interface)的想法,但这样做似乎会变得相当复杂。在我跳进那个兔子洞之前,我想我应该联系专家看看是否有更简单的解决方案。
想法?
编辑:
我想在父对象的线程中运行事件处理程序的部分原因是因为父对象有它自己的事件,这些事件是根据其成员对象发送的事件触发的。我希望此类隐藏任何线程功能,以便使用该类的代码不必担心与线程相关的问题(即锁等)。简单地锁定共享数据不会完成这项工作,因为我*仍然需要从线程事件处理程序中触发事件。
最佳答案
在另一个线程上调用的想法与 while 循环密切相关,它不时检查是否有“外部”消息要处理。对于 UI,有执行此操作的 Windows 循环。对于外部线程,您必须手动编写一个循环。想象一下没有循环的情况,并且您有一个运行时间相对较长的线程,对吧?突然你想中断这个线程来调用你的消息并在同一个共享堆栈内存上恢复它正在做的事情。这种中断会破坏你的堆栈。这根本不可能。另一种可能性是使用诸如 ManualResetEvent 之类的同步机制并等待信号(来自线程外部的信号)。因此,要恢复,以便处理来自另一个线程的消息,您基本上只有两个选择:
1) 你有一个 while 循环,最终使用了一点 sleep (给其他线程一些时间/滴答来完成他们的工作)
while (true) {
Thread.Sleep (5);
if (someMessageArrived) { ... }
}
2) 您只需等待消息以某种方式实现生产者/消费者架构:
On listening thread:
aManualResetEvent.WaitOne ();
On the "producer" thread:
aManualResetEvent.Set ();
.NET 框架中有一些高级类可能会有所帮助,例如 BlockingCollection。
希望对你有帮助
关于c# - 强制事件处理程序在对象的线程上运行,C# .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31732639/
我一直很难编辑我的 .htaccess 文件来一起做这三件事。我已经能够分别获得每个部分,但我只是不明白逻辑流程如何使它们全部工作。 这是我能够使用 bluehost support 上的演示进行整合
我制作的宏将模板工作簿保存为两个单独的文件。每个测试保存一个(位置 1、2、3 或 4),然后在另一个宏中使用每个测试的数据。第二个是保留用于备份的原始数据文件。现在的问题是每次我在每个位置运行测试并
我正在写一篇关于如何使用 OCaml 的模块系统而不是 Java 的 OO 系统(一个有趣的视角)的博客文章。我遇到了一些我不理解的关于强制的事情。下面是一个基本模块和两个包含它的模块: module
我有一段将被执行多次(5,000+)的代码,以及一个仅在第一次为真的 if 语句。我曾想过使用“FIRST”变量并每次都进行比较,但每次都检查它似乎是一种浪费,即使我知道它不需要。 bool FIRS
首先,我是 Perforce 的新手,我主要通过其文档进行学习。 因此,我们即将从 CVS 迁移到 Perforce,我最近学到了一个避免更改每个工作区的 P4CLIENT 的好方法,即在工作区根目录
我正在为一段代码编写测试,其中包含我试图涵盖的 IOException 捕获。 try/catch 看起来像这样: try { oos = new ObjectOutputStream(new
我正在尝试在新闻项目滚动之间添加延迟。我知道 $.each() 通过不等待动画完成来完成其工作,但我想知道如何制作它,以便一次向上滚动一个项目并等到最后一个动画完成后再继续在循环中。 $(functi
假设已经编写了一个方法,需要一个排序列表作为其输入之一。当然这将在代码中进行注释和记录,param 将被命名为“sortedList”,但如果有人忘记,则会出现错误。 有没有办法强制输入必须排序?我正
我正在尝试将传入请求重定向到 https://www.domain.com/和所有 https://www.domain.com/ {所有页面}并且没有什么麻烦。我试过的方法: 添加此行:Redire
我将如何实现以下内容: title_selection = raw_input("Please type in the number of your title and press Enter.\n%
我有一个登录表单,我需要强制关闭自动完成功能。我试过了 jquery: $('#login').attr("autocomplete", "off"); HTML: Javascript:docume
我想知道我应该怎么做才能强制从 dev 分支 merge 到我的 master 分支?使用“git merge dev”会导致很多冲突。但是,我不想单独处理它们。相反,我只是想使用我的 dev 分支中
当安装 Hl7.Fhir.DSTU2 和 Hl7.Fhir.R4 这两个 Nuget 包时,我们得到如下信息: DSTU2 包似乎在使用 Hl7.Fhir.Support.Poco 版本 3.4.0
我正在尝试让一个功能组件在 testFn 执行时强制重新渲染。我想使用状态来做到这一点(如果有更好的方法请说出来),这似乎成功地强制重新渲染但只有两次,然后什么都没有。 我构建了一个简单的演示来模拟这
默认情况下,g++ 似乎会省略未使用的类内定义方法的代码。示例 from my previous question : struct Foo { void bar() {} void baz(
我正在尝试使用 here 中介绍的技术使我的网站背景以比内容慢的速度滚动。我不希望背景固定,只希望更慢。 这是 HTML 的样子: .parallax { perspective: 1px;
我能找到的最相似的问题是 'how to create a row of scrollable text boxes or widgets in flutter inside a ListView?'
我有以下 eslint 配置: "object-curly-newline": ["error", { "ImportDeclaration": "never",
我正在使用 TinyMCE 插件并将 valid_elements 选项设置为: "a[href|target:_blank],strong/b,em/i,br,p,ul,ol,li" 即使没有列出数
您好,我想使用以下命令放置多行描述 p4 --field Description="MY CLN Header \\n my CLN complete description in two -thre
我是一名优秀的程序员,十分优秀!