我的代码中的if语句不起作用,它总是直接转到其他地方,我肯定知道值为IS 255但它仍然不会去,如果,我甚至尝试在其他地方测试它据报道它是255,所以我不知道它为什么一直这样做,我现在真的很困惑,有人可以帮忙吗?
public Form1()
{
InitializeComponent();
serialPort1.Open();
string lastLine = string.Empty;
Task.Run(() =>
{
while (true)
{
string tailValue = lastLine;
lastLine = serialPort1.ReadLine();
string line = lastLine;
label1.BeginInvoke(new Action(() =>
{
label1.Text = string.IsNullOrEmpty(line) || string.Equals(tailValue, line)
? label1.Text
: $"{line}";
}));
if (label1.Text == "255")
{
Console.WriteLine(label1.Text);
System.Diagnostics.Process.Start("http://www.google.com");
Task.Delay(10000).Wait();
}
Task.Delay(1000).Wait();
}
});
}
答案 0 :(得分:1)
这里发生的是你正在执行异步代码,但是在尝试使用它之前不等待计算结果。
这是BeginInvoke的文档。请注意说明:
在该线程上异步执行指定的委托 控件的底层句柄是在。上创建的。
因此,当调用BeginInvoke
时,下一个语句(在您的情况下是if
语句)将在不等待您的操作完成的情况下执行。
那么在执行Action之前label1
的值是多少? (它可能不是255)
解决此问题的一种方法是使用Invoke
而不是BeginInvoke
- 您已经将其封装在Task.Run中,那么为什么要尝试启动另一个异步调用,尤其是看起来像一个简单的计算,下一个方法取决于。
Invoke
的工作原因是因为与BeginInvoke
不同,它是同步通话。调用线程阻塞,直到Invoke
完成。