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 包。

浙公网安备 33010602011771号