死穴:安全性
CheckForIllegalCrossThreadCalls容许子线呈随时更新ui,在同一个test函数体内,不能保证自身事务的一致性。给label1付了值
一回头,就已经被别人改了,这和超市的踩踏事件的后果一样严重。
当然你可以自己加锁,用信号量,这样还不如直接使用Invoke了,你只是又把别人做好的事情做了一遍。
如果你觉的你的应用不会考虑在写入ui的同时来读取ui,而倾向使用CheckForIllegalCrossThreadCalls来追求效率的话,也是不恰当的做法。
首先CheckForIllegalCrossThreadCalls并不能让效率发生本质的变化。
其次需求永远是变化的,现在不考虑不等于以后不会碰到
听从ms的引导。否则以后要在高版本的.net framework中移植代码的时候需要花费数倍的人工。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
//Thread t = new Thread(Ser);
//t.Start();
Form1.CheckForIllegalCrossThreadCalls = false;
new Thread(new ThreadStart(doThread)).Start();
new Thread(new ThreadStart(doThread)).Start();
}
private void Ser() {
this.label1.Text = "冯雷彪";
}
private void Form1_Load(object sender, EventArgs e)
{
//Control.CheckForIllegalCrossThreadCalls = false;
}
void text() {
string strtext = Guid.NewGuid().ToString();
this.label1.Text = strtext;
if (this.label1.Text != strtext) {
throw new Exception(":Label 值发生意外的改变");
}
}
void doThread() {
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Reset();
sw.Start();
for (int i = 0; i < 100; i++)
{
text();
System.Threading.Thread.Sleep(10);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
}
public delegate void dText();
void InvokeThread()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Reset();
sw.Start();
for (int i = 0; i < 100; i++)
{
if (this.InvokeRequired)
{
this.Invoke(new dText(text));
}
else
{
text();
}
System.Threading.Thread.Sleep(10);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
}
private void Button2_Click(object sender, EventArgs e)
{
new Thread(new ThreadStart(InvokeThread)).Start();
new Thread(new ThreadStart(InvokeThread)).Start();
}
}
}