2011-10-13 19 views
6

Tôi rất mới để luồng. Tôi hy vọng ai đó có thể cho tôi một số ví dụ.WPF luồng C#

Tôi đang cố gắng để bắt đầu một chủ đề khi người dùng nhấp chuột vào nút bắt đầu và làm quy trình sau:

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

private void GotRawData() là một phương pháp mà tôi làm điều gì đó để có được một số dữ liệu thô từ một phần cứng.

+0

Xem câu hỏi này để biết thêm thông tin về BackgroundWorker: http://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker –

Trả lời

7

Bạn có thể tìm thấy lớp học System.ComponentModel.BackgroundWorker khá hữu ích theo cách hiểu của tôi là cách đơn giản nhất để thực hiện thao tác trên một chuỗi riêng biệt.

+0

Tôi đã xem xét điều đó nhưng tôi không biết cách sử dụng nó. Tôi đi qua rất nhiều luồng, không biết cái nào tốt hơn cho trường hợp của tôi. Ví dụ như threadPool và Dispatcher và backgroundWorker này. Tôi muốn có một số ví dụ dựa trên dự án của tôi. Tôi dễ hiểu hơn. Cảm ơn anyway vì đã trả lời =) – user981924

+0

Không vấn đề gì - vui vì điều đó đã giúp ích. Để bắt đầu, chỉ cần bọc bất kỳ mã nào bạn cần chạy trong một chuỗi riêng biệt trong sự kiện ['DoWork'] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.dowork.aspx) của nó xử lý. Tuy nhiên tôi khuyên bạn nên đi qua các mẫu mã tại MSDN, chúng cũng được ghi lại. –

0

Tôi không biết mình có hiểu đúng câu hỏi hay không. Khi người dùng nhấp vào một nút, bạn muốn bắt đầu một luồng riêng biệt và nhận dữ liệu từ cổng nối tiếp ở đó. Tôi nghĩ rằng đây nên rằng:

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

Bạn sẽ không thực hiện bất kỳ cuộc gọi chặn trong btnStart_Click, vì vậy nó là tốt để chỉ chạy trên thread UI chính.

Một vài điểm:

  • Hãy nhớ rằng GotRawData sẽ được gọi là trên một sợi công nhân, vì vậy nếu bạn đang truy cập vào bất kỳ điều khiển giao diện người dùng, bạn sẽ phải sắp xếp những cuộc gọi trở lại vào thread UI.

  • Từ MSDN SerialPort.Open:

Các thực hành tốt nhất cho bất kỳ ứng dụng là phải chờ một khoảng thời gian sau khi gọi phương thức Close trước khi cố gắng gọi phương thức Open, như cảng có thể không được đóng ngay lập tức.