c#调用Monitor.Pulse()时抛出对象同步错误
c# Object synchronisation error is thrown when calling Monitor.Pulse()
我正在尝试在我的 GUI 系统中的两个线程之间进行同步。
系统初始化两个同步对象和运行两个线程的主要任务:
private FetcherAPI fetcherAPI { get; set; }
private FileReader fileReader { get; set; }
private object readerLocker;
private object writerLocker;
public Form1() {
InitializeComponent();
this.fetcherAPI = new FetcherAPI();
this.fileReader = new FileReader();
readerLocker = new object();
writerLocker = new object();
new Thread(() => {
this.fileReader.run(readerLocker);
});
new Thread(() => {
this.fixerAPI.run(writerLocker, readerLocker);
});
}
private void button1_Click(object sender, EventArgs e) {
Monitor.Pulse(writerLocker);
}
Reader 主题:
public void run(object readerLocker) {
while(true) {
Monitor.Wait(readerLocker);
readDataFromFileAndPresent();
}
}
作者主题:
public void run(object writerLocker, object readerLocker) {
while(true) {
Monitor.Wait(writerLocker);
fetchCurrency();
Monitor.Pulse(readerLocker);
Monitor.Wait(readerLocker);
}
}
按下按钮时出现以下错误:
object synchronization method was called from an unsynchronized block of code
我做错了什么?
Wait
和 Pulse
都只能被调用 如果您已经拥有锁 ,即您在 lock
语句中,或者您已成功使用 Monitor.Enter
获取锁。您还没有完成任何这些事情,所以:确实,它不会起作用。最简单的解决方法是添加 lock(writerLocker)
.
我正在尝试在我的 GUI 系统中的两个线程之间进行同步。
系统初始化两个同步对象和运行两个线程的主要任务:
private FetcherAPI fetcherAPI { get; set; }
private FileReader fileReader { get; set; }
private object readerLocker;
private object writerLocker;
public Form1() {
InitializeComponent();
this.fetcherAPI = new FetcherAPI();
this.fileReader = new FileReader();
readerLocker = new object();
writerLocker = new object();
new Thread(() => {
this.fileReader.run(readerLocker);
});
new Thread(() => {
this.fixerAPI.run(writerLocker, readerLocker);
});
}
private void button1_Click(object sender, EventArgs e) {
Monitor.Pulse(writerLocker);
}
Reader 主题:
public void run(object readerLocker) {
while(true) {
Monitor.Wait(readerLocker);
readDataFromFileAndPresent();
}
}
作者主题:
public void run(object writerLocker, object readerLocker) {
while(true) {
Monitor.Wait(writerLocker);
fetchCurrency();
Monitor.Pulse(readerLocker);
Monitor.Wait(readerLocker);
}
}
按下按钮时出现以下错误:
object synchronization method was called from an unsynchronized block of code
我做错了什么?
Wait
和 Pulse
都只能被调用 如果您已经拥有锁 ,即您在 lock
语句中,或者您已成功使用 Monitor.Enter
获取锁。您还没有完成任何这些事情,所以:确实,它不会起作用。最简单的解决方法是添加 lock(writerLocker)
.