• WinFrm中多线程操作窗体属性


    1. 首先声明一个委托。

      delegate void SetTextCallback(string text);

      C#winform的线程中如何调用窗体控件
    2. 然后再写一个事件。

       private void SetInfo(string text)

              {

                  /// 这个事件是委托执行,在线程中无法直接控制窗体控件属性

                  /// 用于在线程中在listBox_info控件中添加执行信息

                  if (this.listBox_info.InvokeRequired)

                  {

                      SetTextCallback d = new SetTextCallback(SetInfo);

                      this.Invoke(d, new object[] { text });

                  }

                  else

                  {

                      this.listBox_info.Items.Add(text);

                      listBox_info.SelectedIndex = listBox_info.Items.Count - 1;

                  }

              }

      C#winform的线程中如何调用窗体控件
    3. 3

      在线程中使用时,只需调用这个方法即可。

      C#winform的线程中如何调用窗体控件
       
      如此使用的原因是:
      操作系统有一个线程,循环获取最新窗体事件,然后触发窗体事件函数, 修改窗体控件属性, 为了避免其他线程同时修改控件属性带来的冲突,当某个方法修改控件属性时,要判断该方法和系统事件是否为同意线程, 如果不是,则通过Invoke函数,将修改方法封装成一个事件,放到消息队列中。
       
      ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       private void button1_Click(object sender, EventArgs e)
              {
                  Console.WriteLine("111 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + "  " + DateTime.Now.ToLongTimeString());
                  AsyncMethod();//这个方法就是异步方法,异步方法的调用与一般方法完全一样
                  Console.WriteLine("222 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + "  " + DateTime.Now.ToLongTimeString());
                  Thread.Sleep(10 * 1000);
                  Console.WriteLine("333 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + "  " + DateTime.Now.ToLongTimeString());
              }
      
      
              private async Task AsyncMethod()
              {
                  var ResultFromTimeConsumingMethod = TimeConsumingMethod();
                  string Result = await ResultFromTimeConsumingMethod;
                  Result += " + AsyncMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + "  " + DateTime.Now.ToLongTimeString();
                  Console.WriteLine(Result);
              }
      
              private Task<string> TimeConsumingMethod()
              {
                  var task = Task.Run(() => {
                      Console.WriteLine("Helo I am TimeConsumingMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + "  " + DateTime.Now.ToLongTimeString());
                      Thread.Sleep(5000);
                      Console.WriteLine("Helo I am TimeConsumingMethod after Sleep(5000). My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + "  " + DateTime.Now.ToLongTimeString());
                      return "Hello I am TimeConsumingMethod";
                  });
                  return task;
              }

      以上代码在Winfrm执行结果为:

      在控制台执行结果为:

       
  • 相关阅读:
    软件工程实践2017第一次作业
    第七次作业
    图结构练习——最短路径(floyd算法(弗洛伊德))
    图结构练习——最短路径(dijkstra算法(迪杰斯拉特))
    图结构练习——最小生成树(kruskal算法(克鲁斯卡尔))
    图结构练习——最小生成树(prim算法(普里姆))
    基于邻接矩阵的深度优先搜索遍历
    基于邻接表的深度优先搜索遍历
    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
    数据结构实验之图论二:基于邻接表的广度优先搜索遍历
  • 原文地址:https://www.cnblogs.com/cnhk19/p/13728342.html
Copyright © 2020-2023  润新知