1. 程式人生 > >c#多執行緒操作UI控制元件

c#多執行緒操作UI控制元件

一、WPF中使用Dispatcher.BeginInvoke

步驟 

使用Thread新建並開始一個執行緒 

在新建的執行緒處理函式中需要修改介面的時候獲取介面的dispatcher 

使用DispatcherBeginInvoke方法指定一個執行緒優先順序,和一個委託,這個委託時用於修改介面內容的 

private void button1_Click(object sender, RoutedEventArgs e)
        {
            Thread t = new Thread(setNum);
            t.Start();
        }
        private void setNum()
        {
            label1.Dispatcher.BeginInvoke(DispatcherPriority.Normal,(ThreadStart)delegate()
            {
                  this.label1.Content = DateTime.Now;
            });
        }

二、WPF中使用Dispatcher.Invoke

private void button1_Click(object sender, RoutedEventArgs e)
        {
            Thread t = new Thread(setNum);
            t.Start();
        }
        private void setNum()
        {
            this.label1.Dispatcher.Invoke(new Action(delegate { 
                this.label1.Content = DateTime.Now; 
            })); 
        }

c#中禁止跨執行緒直接訪問控制元件InvokeRequired是為了解決這個問題而產生的

 private delegate void setStrDel();
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(setStr);
            t.Start();
        }
        private void setStr()
        {
 //當一個控制元件的InvokeRequired屬性值為真時,說明有一個建立它以外的執行緒想訪問它
            if (label1.InvokeRequired)
            {
                setStrDel del = new setStrDel(setStr);
                label1.Invoke(del);
            }
            else
            {
                this.label1.Text = "BC";
            }
        }
  class Program
    {
        private delegate double threadEvent(double x);
        private static threadEvent threadevent;
       static double result = 0;
        static void Main(string[] args)
        {
            threadevent = new threadEvent(getNum);
            //第一個引數是委託的方法中的引數列表(getNum的引數列表)
       //第二個引數是執行的回撥函式,如果函式執行完畢。就呼叫callback的方法執行
            //第三個引數一般傳這個委託物件
            //委託呼叫BeginInvoke()表示開始執行非同步操作
            threadevent.BeginInvoke(3.0, TaskFinished, null);
            Console.WriteLine(result);//輸出0
            Console.ReadKey();
        }
        private static double getNum(double x)
        {
            return x * Math.PI;
        }
        private static void TaskFinished(IAsyncResult ir)
        {
            //EndInvoke,有一個引數列表,一個引數
            //引數是IAsyncResult型別,MSDN用幾個字描述了:表示非同步操作的狀態。
            //每次都要呼叫 EndInvoke 來完成非同步呼叫。 
            //委託呼叫EndInvoke()表示非同步操作執行結束
            result =threadevent.EndInvoke(ir);
            Console.WriteLine("bc   "+result);//輸出9.4
        }
    }

五、BackgroundWorker 非同步操作

 class Program
    {
        private static BackgroundWorker bw = new BackgroundWorker();

        static void Main(string[] args)
        {
            //定義需要在子執行緒中呼叫的函式
            bw.DoWork += new DoWorkEventHandler(print);
            //定義執行完畢後呼叫的函式
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(print1);
            bw.RunWorkerAsync();//開始執行
            Console.WriteLine("主執行緒 " + Thread.CurrentThread.ManagedThreadId);
            Console.ReadKey();
        }
        //注意print()與print1()引數列表
        private static void print(object sender, DoWorkEventArgs e)
        {
            Console.WriteLine("子執行緒中乾的事情"+Thread.CurrentThread.ManagedThreadId);
        }
        private static void print1(object sender, RunWorkerCompletedEventArgs e)
        {
            Console.WriteLine("執行完畢後做的事情" + Thread.CurrentThread.ManagedThreadId);
        }
    }

序列化與反序列化

序列化操作
[BinarySerializer]標記在要序列化的類上邊

IFormatter formatter = new BinaryFormatter(); 
建立,獲取Stream物件
formatter.Serialize(stream, obj); 
stream.Close(); 

反序列化操作
IFormatter formatter = new BinaryFormatter(); 
建立,獲取Stream物件
MyObject obj = (MyObject) formatter.Deserialize(Stream物件); 
stream.Close(); 

相關推薦

c#執行操作UI控制元件

一、WPF中使用Dispatcher.BeginInvoke 步驟  使用Thread新建並開始一個執行緒  在新建的執行緒處理函式中需要修改介面的時候獲取介面的dispatcher  使用Dispatcher的BeginInvoke方法指定一個執行緒優先順序,和一個委託,

執行操作UI控制元件——DataGridView假死現象

  在多執行緒程式設計中,如果你從非建立這個控制元件的執行緒中訪問這個控制元件或者操作這個控制元件的話就會丟擲這個異常。這是微軟為了保證執行緒安全以及提高程式碼的效率所做的改進,但是也給大家帶來很多不便

WPF執行更改UI控制元件問題

無論是在WINFORM中,還是在WPF中,在涉及到複雜的邏輯關係時,如果在非同步執行緒中需要更改介面控制元件,需要通過以下機制進行操作,從而達到非同步更改介面控制元件的目的。 即   Dispatcher.Invoke(new Action(() =>   &nbs

[轉]C#子執行更新UI控制元件的方法例項總結

[我的評論:之前專案做的C#客戶端對於多執行緒修改UI使用的就是這個,找了好些時間才找到,其他很多都是沒有再函式中直接使用Action<>放置delegate的,而是在全域性下先放一個delegate的宣告,很頭疼,特轉] [來源:http://www.jb51

[Xcode10 實際操作]八、網路與執行-(20)時間控制元件Timer定時功能

本文將演示時間控制元件Timer定時功能的使用。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 ove

c#執行操作測試(阻塞執行,結束任務)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Te

C#跨執行訪問winform控制元件的方法

方法一:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;  不推薦使用這種方式,禁止編譯器對跨執行緒訪問做檢查的方式實現。   方法二:使用delegate和invoke

winform跨執行操作webBrowser控制元件

一、解決問題 在winform上呼叫百度地圖,使用了webBrowser控制元件。當不跨執行緒時,使用正常。使用子執行緒操作webBrowser控制元件時出現了一下錯誤。        子執行緒中對窗體上的控制元件操作是會出現異常,這是由於子執行

C# 執行操作介面時,使用Invoke與BeginInvoke的區別

Invoke方法的引數很簡單,一個委託,一個引數表(可選),而Invoke方法的主要功能就是幫助你在 UI執行緒(即建立控制元件的執行緒)上呼叫委託所指定的方法。Invoke方法首先檢查發出呼叫的執行緒(即當前執行緒)是不是UI執行緒,如果是,直接執行委託指向 的方法

C# 跨執行操作UI(介面)

C# winform程式裡經常會用到多執行緒,如果線上程的邏輯處理裡面有需要重新整理UI的,就需要交給委託來處理。 如下: 定義委託 private delegate void Sho

C#執行操作的學習

當按照先後順序開啟兩個執行緒的時候,第一先開啟的執行緒,執行緒內部任務還未執行完的時候,其實第二個語句已經開始,第二 個語句就是開啟第二,那麼第二個執行緒內部任務會和執行緒一的任務併發執行。優先順序會改變他們的執行頻率。 一、關於開啟執行緒方法兩種: 第一種: Thread t = new Thread(Wo

C# 跨執行呼叫窗體控制元件

//定義委託 delegate void MyInvoke(string s); //呼叫方法 private void SetText(string s) {

Swing中執行操作UI

由於Swing不是執行緒安全的, 因此在實際操作過程中, 應避免通過多執行緒來操作UI. 在必要時, 應注意要將控制元件轉移到事件排程執行緒。轉移控制元件和開始處理 Swing 的首選方法是使用 invokeLater。 簡單的實踐: 在如下小程式中, 通過最上方或最下方的

2017.10.21 C# 執行控制控制元件例項

直接上程式碼片段 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text

2017.10.20 C#跨執行操作控制元件執行安全方法

C#跨執行緒操作控制元件的執行緒安全方法 在C#中,經常用到這樣一個場景,Windows Form程式啟動一個工作者執行緒執行一部分工作,這樣做是為了避免速度慢的工作如果直接呼叫會使得主Form停止響應一段時間。 既然啟動了執行緒,就避免不了執行緒之間資料傳遞的事情,相信你有很多種辦法

C#執行非同步訪問winform中控制元件

我們在做winform應用的時候,大部分情況下都會碰到使用多執行緒控制介面上控制元件資訊的問題。然而我們並不能用傳統方法來做這個問題,下面我將詳細的介紹。       首先來看傳統方法:      public partial class Form1 : Form    

C#執行中訪問winform控制元件

方法一:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;  不推薦使用這種方式,禁止編譯器對跨執行緒訪問做檢查的方式實現。 方法二:使用delegate和invoke private

C# 執行與跨執行訪問介面控制元件

在編寫WinForm訪問WebService時,常會遇到因為網路延遲造成介面卡死的現象。啟用新執行緒去訪問WebService是一個可行的方法。 典型的,有下面的啟動新執行緒示例: private void LoadRemoteAppVersion()

Winform控制元件執行操作控制元件的解決方案

1)在要訪問的控制元件的那個窗體,定義公共屬於或公共方法,這樣可以實現間接的訪問 2)在主窗體,定義方法來包裝上面定義的另外一個窗體的方法,然後定義委託。 3)如果當執行緒,直接委託實現就可以,如果多執行緒,用invoke技術 在多執行緒程式設計中,我們經常要在工作執行緒中去

C# 執行中更新窗體控制元件

在C#中用到多執行緒處理一些功能,同時希望介面同步顯示更新,如果直接寫程式碼就會出現一些問題: 問題程式碼: Thread ScanFileThread; ScanFileThread = new Thread(WorkScanFileThread);  this.Scan