gpt4 book ai didi

c# - 如何让 C# 计时器在创建它的同一线程上执行?

转载 作者:行者123 更新时间:2023-12-04 22:33:43 24 4
gpt4 key购买 nike

我想启用 IMessageFilter在 Excel 插件上,我必须写到 excel。
我以 here 为例其中说:

Message filters are per-thread, so we register this thread as a message filter (not the main thread that the add-in is created on - because that's Excel's main thread



我的问题是我的系统在计时器结束时写入 excel,这导致从 ThreadPool 线程调用写入方法,该线程中断 IMessageFilter由于 excel 无法访问 RetryRejectedCall IMessageFilter 的一部分,因为它存在于调用者线程上,而不是由计时器产生的正在执行的线程上。

所以,我的问题是:有没有办法可以强制计时器的 Elapsed 事件在初始化计时器的同一线程上运行?

EDIT:



我的问题是,我该如何制作 IMessageFilter在抛出拒绝/忙碌时捕获 excel 错误?

谢谢

最佳答案

您可以使用 Timer.SynchronizingObject用于编码(marshal)时间间隔已过时发出的事件处理程序调用的属性。

这是来自 MSDN :

When the Elapsed event is handled by a visual Windows Forms component, such as a button, accessing the component through the system-thread pool might result in an exception or just might not work. Avoid this effect by setting SynchronizingObject to a Windows Forms component, which causes the method that handles the Elapsed event to be called on the same thread that the component was created on.



假设您正在使用 WinFrom 并且您正在从主窗体中创建计时器实例:
System.Timers.Timer t = new System.Timers.Timer();
t.SynchronizingObject = this;
t.Elapsed += t_Elapsed;
t.Start();

关于c# - 如何让 C# 计时器在创建它的同一线程上执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13738059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com