zoukankan      html  css  js  c++  java
  • 新增线程执行可能有延迟的语句

    有时需要新增线程执行可能有延迟的语句,如从远程数据库中提取数据实时验效时:

    System.Threading.Thread th =new System.Threading.Thread
    (
    ()
    =>BackstageMethod();
    );
    th.Start();

    但是请注意根据WPF实现的安全模型,只有一个用户的对象自己创建的线程才能访问该对象,这就是说,后台线程不能直接修改界面对象。在WPF中,则需要使用控件上的System.Threading.Dispatcher对象来执行封送操作。Dispatcher的Invoke方法可发送一个请求,如:

    1 using System.Threading;
    2  using System.Windows.Threading;
    3
    4
    5 void textBox1_LostKeyboardFocus(object sender,,KeyboardFocusChangedEventArgs e)
    6 {
    7 Thread th =new Thread
    8 (
    9 () =>bw_DoWork("第二线程传送的值")
    10 );
    11 //执行第线线程;
    12   th.Start();
    13 }
    14 void bw_DoWork(string t)
    15 {
    Thread.Sleep(1000);
    16 //将要执行的方法放入一个委托实例中
    17   Action action =new Action(
    18 () => textBox2.Text=t
    19 );
    20    //在应用程序空闲时处理操作
    21   Dispatcher.Invoke(action, DispatcherPriority.ApplicationIdle);
    22 }

    另外,可以使用Tast类来操作:可以将上面变成Tast tast = New Tesk(delegate{bw_DoWork("this is Task")});

    如果是一连串有顺序的Task可以:

           Task first = Task.Factory.StartNew(() => generateGraphData(data, 0, pixelWidth /8));
    Task second
    = Task.Factory.StartNew(() => generateGraphData(data, pixelWidth /8, pixelWidth /4));
    Task third
    = Task.Factory.StartNew(() => generateGraphData(data, pixelWidth /4, pixelWidth *3/8));
    Task fourth
    = Task.Factory.StartNew(() => generateGraphData(data, pixelWidth *3/8, pixelWidth /2));
    Task.WaitAll(first, second, third, fourth);

    最后再介绍一个我最近用得较多的类:BackgroundWorker, 它允许你在单独的线程上操作,并将操结果获取后送出来,下面是一个例子:

    public partial class MainPage : UserControl
        {
            private BackgroundWorker worker = new BackgroundWorker();
            public MainPage()
            {         
                InitializeComponent();
    
                radBusyIndicator.IsBusy = true;
                worker.DoWork += InitialGvMain;//在单独的线程上操作,其中的e.Result获取操作结果
                worker.RunWorkerCompleted += 
                    new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);//在操作完成时用e.Result接收上面的操作结果
                worker.RunWorkerAsync();//异步操作开始    
            }
    
            void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                //Action action = new Action(
                   // () =>
                   // {
                        gvMain.ItemsSource = e.Result;//接收InitialGvMain中的view
                        radBusyIndicator.IsBusy = false;
                   // }
                   // );
                //Dispatcher.BeginInvoke(action);        
            }
    
            private void InitialGvMain(object sender, DoWorkEventArgs e)
            { 
                Guests RG = new Guests();
                QueryableCollectionView view =
                    new QueryableCollectionView(RG.GetRandomGuest(55));
                view.PageSize = 10;
                e.Result = view;//结果类型是任意的
            }
        }
    
  • 相关阅读:
    【Project Euler】1 第一题
    【OpenCV归纳】5 图像处理
    【OpenCV归纳】4 关于HighGUI
    【OpenCV归纳】3 在实例中学习简单函数以及数据读写
    【OpenCV归纳】2 读写视频
    【OpenCV归纳】1 体验OpenCV
    【SICP练习】27 练习1.33
    【SICP练习】26 练习1.32
    【SICP练习】25 练习1.31
    【SICP练习】24 练习1.30
  • 原文地址:https://www.cnblogs.com/Laro/p/1957677.html
Copyright © 2011-2022 走看看