如果声明过去了

时间:2018-03-29 01:23:44

标签: c# serial-port

我的代码中的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();
        }
    });
}

1 个答案:

答案 0 :(得分:1)

这里发生的是你正在执行异步代码,但是在尝试使用它之前不等待计算结果。

这是BeginInvoke的文档。请注意说明:

  

在该线程上异步执行指定的委托   控件的底层句柄是在。上创建的。

因此,当调用BeginInvoke时,下一个语句(在您的情况下是if语句)将在不等待您的操作完成的情况下执行。

那么在执行Action之前label1的值是多少? (它可能不是255)

解决此问题的一种方法是使用Invoke而不是BeginInvoke - 您已经将其封装在Task.Run中,那么为什么要尝试启动另一个异步调用,尤其是看起来像一个简单的计算,下一个方法取决于

Invoke的工作原因是因为与BeginInvoke不同,它是同步通话。调用线程阻塞,直到Invoke完成。