2011-10-13 34 views
6

我很新的线程。我希望有人能给我一些例子。WPF线程C#

我试图启动一个线程时开始按钮用户点击并执行以下操作过程:

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()); 
    } 
} 

私人无效GotRawData()是我做了什么让从一些原始数据的方法硬件。

+0

看到这个问题得到BackgroundWorker的更多信息:http://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker –

回答

7

您可能会发现 System.ComponentModel.BackgroundWorker类相当有用,这在我的理解中是在单独的线程上执行操作的最简单方法。

+0

我已经考虑这样做,但我不知道如何实际使用它。我遇到了很多线程,不知道哪一个更适合我的情况。像threadPool和Dispatcher和这个backgroundWorker的例子。我想根据我的项目做一些示例。更容易理解。无论如何谢谢回答=) – user981924

+0

没问题 - 很高兴它有帮助。要开始只是将你需要运行的代码包装在其['DoWork'](http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.dowork.aspx)事件中的单独线程中运行处理程序。尽管如此,我仍然建议您在MSDN中浏览代码示例,这些示例都是有据可查的。 –

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

任何应用程序的最佳做法是试图调用Open方法之前调用Close方法之后等待一定的时间,因为端口可能无法立即关闭。