gpt4 book ai didi

c#调用Monitor.Pulse()时抛出对象同步错误

转载 作者:行者123 更新时间:2023-11-30 22:53:01 24 4
gpt4 key购买 nike

我正在尝试在我的 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);
}

读者主题:

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

我做错了什么?

最佳答案

WaitPulse 只能在您已经拥有锁的情况下调用,即您在 语句,或者您已成功使用 Monitor.Enter 获取锁。您还没有完成任何这些事情,所以:确实,它不会起作用。最简单的修复方法是添加一个 lock(writerLocker)

关于c#调用Monitor.Pulse()时抛出对象同步错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57678986/

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