我是C#的新手,我想了解Task的逻辑。
我等待打开LED灯泡的设备的响应。我想等到灯泡标志变为true,然后对其进行序列化。
1)我在这里检查了很多问题,其中大多数使用Task数组,但是我只有一个任务。我发现了this个问题,并应用了相同的逻辑,但是,我的任务什么也没做。
2)最重要的是,我在附近放置了断点:
m_Condition.Set();
和m_Condition.Set();
,似乎编译器甚至看不到Task,它们没有任何价值。但是, led为开(表示light_flag为true),但是当我在序列化之前和之后进行打印时,light_flag
看起来是错误的。我无法把握时机,这是真的。
3)另外,我尝试创建一个线程而不是Task,但是当它变为true时我无法捕获该值。
我被困住了,能给我指路吗?
ManualResetEventSlim m_Condition = new ManualResetEventSlim(false);
public bool Condition {
get {
return m_Condition.IsSet;
}
set {
if (!obj.light_flag) m_Condition.Set();
else m_Condition.Reset();
}
}
private void chk_Test1_CheckedChanged(object sender, EventArgs e) {
if (chk_Test1.Checked == true) SendMsg("light_flag");
Task myTask = Task.Run(() = >{
m_Condition.Wait();
Serialize();
});
}
void Serialize() {
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
File.WriteAllText(path_combined, json);
}
答案 0 :(得分:1)
我用线程解决了这个问题,在将消息发送到设备之前给出了线程的开始。这样它就不会丢失消息(当light_flag返回true时)。