WPF多线程C#

6

我是一个新手,对多线程不太了解。希望有人能给我一些示例。

我正在尝试在用户点击开始按钮时启动一个线程,并执行以下过程:

private void btnStart_Click(object sender, RoutedEventArgs e)
{
    if (serialPort.IsOpen)
        serialPort.Close();
    try
    {
        //To set all the parameters for Serial Comm
        serialPort.PortName = "COM14";
        serialPort.BaudRate = int.Parse("38400");
        serialPort.Parity = Parity.None;
        serialPort.DataBits = 8;
        serialPort.StopBits = StopBits.One;
        serialPort.Encoding = System.Text.Encoding.ASCII;

        serialPort.DataReceived += new SerialDataReceivedEventHandler(GotRawData);

        serialPort.Open();

        //To show that Com Port is Opened
        txtboxOutput.AppendText(DateTime.Now.ToString("hh:mm:ss tt") + " - COM14 is opened." + Environment.NewLine);
        txtboxOutput.ScrollToEnd();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message.ToString());
    }
}

私有的 void GotRawData() 是一个方法,我在其中做一些事情,从硬件中获取一些原始数据。

请参考以下问题以获取有关BackgroundWorker的更多信息:https://dev59.com/wG035IYBdhLWcg3wVud1 - Emond
3个回答

7

我已经研究过了,但是我不知道如何实际使用它。我遇到了很多线程,不知道哪一个更适合我的情况。例如像 threadPool、Dispatcher 和 backgroundWorker 这样的线程。我希望有一些基于我的项目的示例。这样对我来说更容易理解。无论如何,感谢您的回答 =) - user981924
没问题--很高兴能帮到你。要开始,只需在 DoWork 事件处理程序中将需要运行的任何代码包装在单独的线程中。不过我建议你仍然要浏览MSDN上的代码示例,它们都有很好的文档说明。 - Nano Taboada

0

我不确定我是否正确理解了问题。 一旦用户点击按钮,您想要启动一个单独的线程并在那里从串口接收数据。 我认为应该这样做:

private void btnStart_Click(object sender, RoutedEventArgs e)
{
Thread GetData = new Thread(thFunctionToRun);
GetData.Start();
}

0

btnStart_Click 中,您没有进行任何阻塞调用,因此直接在主 UI 线程上运行是可以的。

几点需要注意:

  • 请记住,GotRawData 将在工作线程上调用,因此如果要访问任何 UI 控件,则必须将这些调用传回 UI 线程。

  • 来自 MSDN SerialPort.Open

对于任何应用程序,最佳实践是在调用 Close 方法后等待一段时间再尝试调用 Open 方法,因为端口可能不会立即关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接