我正在使用 Python .NET 围绕黑盒 .NET DLL 构建 Python API。 DLL 仅执行网络操作。该 DLL 要求我运行 Windows 消息泵循环,否则网络操作会在一段时间后卡住。我在主线程中使用
System.Windows.Forms.Application.Run()
运行 Windows 消息循环。这对于仅接收数据来说效果很好。当我开始从其他 Python 线程调用 DLL 时,我的程序开始表现得很奇怪。我认为这与线程有关,因为问题的发生非常不规律——网络事件消失或出现得很晚。据我所知,Python 和 C# 是线程安全的,但可能是因为多层包装而出现了问题。
所以我有几个问题:
Form.Invoke
在 Windows 事件循环中插入执行。运行非 ui 主循环,您可以使用
Dispatcher.CurrentDispatcher
获取调度程序,它可用于“调用”函数。然后,调用的函数在创建调度程序的线程上执行。不过,被调用的函数需要进行委托,这是 C# 特定的事情,用于传递对函数的引用。
import clr
import threading
# we need to get access to the threading assembly
clr.AddReference("c:\\Program Files\\Reference Assemblies\\Microsoft\\Framework\\v3.0\\WindowsBase.dll")
import System
from System.Windows.Threading import Dispatcher
from System.Windows.Forms import Application
# now get the dispatcher for the current thread
dispatcher = Dispatcher.CurrentDispatcher
def display():
print(threading.current_thread())
# now make this a deligate
deligate = System.Action(display)
def other_thread(dispatcher):
# now you can use the dispatcher from the main thread to
# to schedule a run from an other thread
dispatcher.Invoke(deligate)
thread = threading.Thread(target=other_thread, args=(dispatcher,))
thread.start()
Application.Run()
一些相关链接:
import clr
等)。
当多个线程与相同的函数(管理硬件设备)并行通信时,我遇到了错误。解决方案:
lock = threading.Lock()
device.move(x=1234)
作者:
with lock:
device.move(x=1234)