C# 学习细节记录(一) Fom\跨线程\事件委托\手动抛异常\XP系统WPF

一、Form 窗体使用

使用 form 做为运行时间长的方法时,阻止用户操作时使用 模态对话框

  Show() 非模态对话框

  ShowDialog() 模态对话框

  Form.Dispose() 方法容易出现闪黑屏的情况

  Form.Close() 方法不会

二、跨线程操作窗体

  需要通过委托来实现

  1、 匿名方法,

  官方介绍:delegate 运算符创建一个可以转换为委托类型的匿名方法:

  Func<int, int, int> sum = delegate (int a, int b) { return a + b; };

  2、lambda表达式

  Func<int, int, int> sum = (a, b) => a + b;

  3、使用 delegate 运算符时,可以省略参数列表。 如果这样做,可以将创建的匿名方法转换为具有任何参数列表的委托类型,如以下示例所示:

  Action greet = delegate { Console.WriteLine("Hello!"); };

  greet(); 

 

  Action<int, double> introduce = delegate { Console.WriteLine("This is world!"); };

  introduce(42, 2.7);

 1 例子:
 2 第一种方法:
 3       private delegate void Mydele(int a);
 4         Mydele mydele;
 5         void run(int a)
 6         {
 7             mydele = run;
 8             if(this.InvokeRequired)
 9             {
10                 this.Invoke(mydele, a);
11             }
12             else
13             {
14                 //run的代码
15                 this.Text = a.ToString();//必须在这加上要跑的代码,否则没用
16             }
17         }
18 第二种方法:
19         void run(int a)
20         {            
21                 this.Invoke((Action)delegate { this.Text = a.ToString(); });
22            
23         }
24 25      void run(int a)
26         {            
27             this.Invoke((Action<int>)delegate(int ab) { this.Text = a.ToString(); },a);           
28         }
29 30       void run(int a)
31         {            
32             this.Invoke((Action)(() =>{ this.Text = a.ToString(); }));           
33         }
34 35     void run(int a)
36         {            
37             this.Invoke((Action<int>)((aa) =>{ this.Text = a.ToString(); }),a);           
38         }

三、事件与委托

 事件event: 不允许在自身类外invoke(即使是公有属性public)。

委托delegate:允许在自身类外invoke

 参考:(2条消息) C# event关键字_金城寺的博客-CSDN博客

C# 事件(Event) - 智者见智 - 博客园 (cnblogs.com)

 

例子:猫叫,主人醒,老鼠跑,我觉得很好理解

 1 using System;
 2 
 3 namespace DelegateDemo
 4 {
 5     //定义猫叫委托
 6     public delegate void CatCallEventHandler();
 7     public class Cat
 8     {
 9         //定义猫叫事件
10         public event CatCallEventHandler CatCall;
11         public void OnCatCall()
12         {
13             Console.WriteLine("猫叫了一声");
14             CatCall?.Invoke();
15         }
16     }
17     public class Mouse
18     {
19         //定义老鼠跑掉方法
20         public void MouseRun()
21         {
22             Console.WriteLine("老鼠跑了");
23         }
24     }
25     public class People
26     {
27         //定义主人醒来方法
28         public void WakeUp()
29         {
30             Console.WriteLine("主人醒了");
31         }
32     }
33 
34     class Program
35     {
36         static void Main(string[] args)
37         {
38             Cat cat = new Cat();
39             Mouse m = new Mouse();
40             People p = new People();
41             //关联绑定 
42             cat.CatCall += new CatCallEventHandler(m.MouseRun);
43             cat.CatCall += new CatCallEventHandler(p.WakeUp);
44             cat.OnCatCall();
45 
46             Console.ReadKey();
47         }
48     }
49 }

 四、手动在try中抛异常

 try 

   {

         throw new Exception("....");

    } 

   catch 

   { 

        //这里会获取所有异常

   }

五、XP系统WPF问题

 

windowXP系统

 

在XP系统运行程序必须安装net framework 环境。

 

 

 

.net3.5的程序得安装.net3.5 sp1 ,安装.net3.5 老失败;

 

.net4.0的程序安装.net4.0 。

 

 

 

运行WPF程序运行一段时间,就会关闭程序,过一段时间才能再次打开。无论.net3.5 版本还是.net4.0版本。

 

运行WinFrom 程序,不会无故关闭程序。

 

所以再次制作了WinForm 版本的程序

 

 

 

并且分别制作的.net4.0 和.net3.5版本的WPF 程序和WinFrom 程序。

 

.net4.0 版本的程序 使用的是NModbus4 包;

 

.net3.5 版本的程序 使用的是NModbus 包。

 

posted @ 2021-07-15 20:56  人间的光  阅读(194)  评论(0)    收藏  举报