gpt4 book ai didi

c# - 同步调用(通过调度程序)或直接调用的调用

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:03 24 4
gpt4 key购买 nike

好的,我现在正在为 GUI 编程。但是,我遇到了一个似乎无法自行解决的同步问题。

我正在通过 UDP 远程开始/停止视频播放。传入的代码/命令被解析,然后在“Window”类中执行。

因为它是一个 GUI 元素,任何对元素的调用都必须在创建它的线程上执行。不过,我的 UDP 客户端是在自己的线程上运行的。因此任何调用都需要通过 Dispatcher.Invoke 方法。

然而,这工作正常。这有很多问题。例如,'load' 方法和 'play' 方法可以在彼此之后直接执行。这会导致“play”方法在“load”方法之前执行。因为我无法控制何时对所述对象调用操作。

所以我想,我将在对象上使用监视器/互斥锁/信号量/锁(),然后等待它再次被释放。请参阅下面的代码片段。但这会导致异常:

SynchronizationLockException is thrown by calling the Exit, Pulse, PulseAll, and Wait methods of the Monitor class from an unsynchronized block of code.

所以我正在寻找一种更好/有效的方法来同步两个线程。如果调用是通过调度程序调用的,则其他线程基本上会等待调用的方法完成调用。

另外,如果我使用了错误的术语,请原谅我的措辞。

派发方式:

#region ExecuteDispatch Members
public void Dispatch(Callback call)
{
Dispatch(this, call);
}
public void Dispatch(DispatcherObject o, Callback call)
{
if (!o.Dispatcher.CheckAccess())
{
o.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Send,
new Action(call)
);
}
else
{
call();
}
}
#endregion

应该“同步”的方法:

Monitor.Enter(player);
Dispatch(delegate()
{
player.Stop();
Monitor.Exit(player);
});
Monitor.Enter(player);
Monitor.Exit(player);

最佳答案

一种可能的方法是让一个线程向另一个线程发出他完成工作的信号。因此,您可以使用 AutoResetEvent 或 ManualResetEvent:

AutoResetEvent evt = new AutoResetEvent(false);

Dispatch(delegate()
{
player.Stop();
evt.Set();
});

evt.WaitOne(); //Here the thread waits until Set is called on evt

关于c# - 同步调用(通过调度程序)或直接调用的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6844092/

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