1. 在线程中给textBox1



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApp12
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

// CheckForIllegalCrossThreadCalls = false;
// Class1 cs1 = new Class1();
Thread th = new Thread(test1);
th.Start();
// cs1.ShowEvent = test;

}

public void test1()
{

// ShowlbDevTem("123");
textBox1.Text = "123";

}


private void button1_Click(object sender, EventArgs e)
{

// ShowlbDevTem("112");

}

/* public void test(string str)
{

ShowlbDevTem(str);
}

public delegate void SWTDelegate(string AddStr);
//public delegate void ComsumerTextDelegate(int Index, string AddStr);
public void ShowlbDevTem(string AddStr)
{
if (textBox1.InvokeRequired)
{
SWTDelegate pd = new SWTDelegate(ShowlbDevTem);
textBox1.Invoke(pd, new object[] { AddStr });
}
else
{
textBox1.Text = AddStr;
//richTextBox1.AppendText(AddStr);
}
}

public void dataShow(int row, int column, string str)
{
row = row % 30;
ShowMessage(dataGridViewX1, str, row, column);

}


delegate void ShowMessageDelegate(DataGridView dg, string message, int row, int column);
private void ShowMessage(DataGridView dg, string message, int row, int column)
{
if (dg.InvokeRequired)
{
ShowMessageDelegate showMessageDelegate = ShowMessage;
dg.Invoke(showMessageDelegate, new object[] { dg, message, row, column });
}
else
{

dg.Rows[row].Cells[column].Value = message;
}
}
*/


}
}

运行结果:

C# 线程中操作窗体控件_文本框

线程中是不允许直接操作窗体空间的

怎么解决呢?

方法1: CheckForIllegalCrossThreadCalls = false;

运行ok

方法2:委托实现:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApp12
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

//CheckForIllegalCrossThreadCalls = false;
// Class1 cs1 = new Class1();
Thread th = new Thread(test1);
th.Start();
// cs1.ShowEvent = test;

}

public void test1()
{

ShowlbDevTem("123");
//textBox1.Text = "123";

}


private void button1_Click(object sender, EventArgs e)
{

// ShowlbDevTem("112");

}

/* public void test(string str)
{

ShowlbDevTem(str);
}*/

public delegate void SWTDelegate(string AddStr);
//public delegate void ComsumerTextDelegate(int Index, string AddStr);
public void ShowlbDevTem(string AddStr)
{
if (textBox1.InvokeRequired)
{
SWTDelegate pd = new SWTDelegate(ShowlbDevTem);
textBox1.Invoke(pd, new object[] { AddStr });
}
else
{
textBox1.Text = AddStr;
//richTextBox1.AppendText(AddStr);
}
}

/* public void dataShow(int row, int column, string str)
{
row = row % 30;
ShowMessage(dataGridViewX1, str, row, column);

}


delegate void ShowMessageDelegate(DataGridView dg, string message, int row, int column);
private void ShowMessage(DataGridView dg, string message, int row, int column)
{
if (dg.InvokeRequired)
{
ShowMessageDelegate showMessageDelegate = ShowMessage;
dg.Invoke(showMessageDelegate, new object[] { dg, message, row, column });
}
else
{

dg.Rows[row].Cells[column].Value = message;
}
}
*/


}
}

C# 线程中操作窗体控件_文本框_02

然后我想在类中对空间进行操作,这样还可以么?

试试看

主窗体代码:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApp12
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

//CheckForIllegalCrossThreadCalls = false;
Class1 cs1 = new Class1();
Thread th = new Thread(cs1.test);
th.Start();
// cs1.ShowEvent = test;

}

public void test1()
{

ShowlbDevTem("123");
//textBox1.Text = "123";

}


private void button1_Click(object sender, EventArgs e)
{

// ShowlbDevTem("112");

}

/* public void test(string str)
{

ShowlbDevTem(str);
}*/

public delegate void SWTDelegate(string AddStr);
//public delegate void ComsumerTextDelegate(int Index, string AddStr);
public void ShowlbDevTem(string AddStr)
{
if (textBox1.InvokeRequired)
{
SWTDelegate pd = new SWTDelegate(ShowlbDevTem);
textBox1.Invoke(pd, new object[] { AddStr });
}
else
{
textBox1.Text = AddStr;
//richTextBox1.AppendText(AddStr);
}
}

/* public void dataShow(int row, int column, string str)
{
row = row % 30;
ShowMessage(dataGridViewX1, str, row, column);

}


delegate void ShowMessageDelegate(DataGridView dg, string message, int row, int column);
private void ShowMessage(DataGridView dg, string message, int row, int column)
{
if (dg.InvokeRequired)
{
ShowMessageDelegate showMessageDelegate = ShowMessage;
dg.Invoke(showMessageDelegate, new object[] { dg, message, row, column });
}
else
{

dg.Rows[row].Cells[column].Value = message;
}
}
*/


}
}

class1中代码:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp12
{
class Class1
{
//public Action<string> ShowEvent;
public void test()
{

//ShowEvent("123456789");

Form1 f1 = new Form1();
f1.ShowlbDevTem("112");


}



}
}

运行结果:

C# 线程中操作窗体控件_文本框_03

哎呦,卧槽

运行不报错 但是文本框中是空的,怎么办?

主窗体:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApp12
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

//CheckForIllegalCrossThreadCalls = false;
Class1 cs1 = new Class1();
Thread th = new Thread(cs1.test);
th.Start();
cs1.ShowEvent = test;

}

public void test1()
{

ShowlbDevTem("123");
//textBox1.Text = "123";

}


private void button1_Click(object sender, EventArgs e)
{

// ShowlbDevTem("112");

}

public void test(string str)
{

ShowlbDevTem(str);
}

public delegate void SWTDelegate(string AddStr);
//public delegate void ComsumerTextDelegate(int Index, string AddStr);
public void ShowlbDevTem(string AddStr)
{
if (textBox1.InvokeRequired)
{
SWTDelegate pd = new SWTDelegate(ShowlbDevTem);
textBox1.Invoke(pd, new object[] { AddStr });
}
else
{
textBox1.Text = AddStr;
//richTextBox1.AppendText(AddStr);
}
}

/* public void dataShow(int row, int column, string str)
{
row = row % 30;
ShowMessage(dataGridViewX1, str, row, column);

}


delegate void ShowMessageDelegate(DataGridView dg, string message, int row, int column);
private void ShowMessage(DataGridView dg, string message, int row, int column)
{
if (dg.InvokeRequired)
{
ShowMessageDelegate showMessageDelegate = ShowMessage;
dg.Invoke(showMessageDelegate, new object[] { dg, message, row, column });
}
else
{

dg.Rows[row].Cells[column].Value = message;
}
}
*/


}
}

类中:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp12
{
class Class1
{
public Action<string> ShowEvent;
public void test()
{

ShowEvent("123456789");

// Form1 f1 = new Form1();
//f1.ShowlbDevTem("112");


}



}
}

C# 线程中操作窗体控件_文本框_04

总算可以了 

但是我有两个类,线程在class1,委托在class2回调呢?

主窗体代码不变

class1代码:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp12
{
class Class1
{
public Action<string> ShowEvent;
public void test()
{


// Class2 cs2 = new Class2();
// cs2.test(ShowEvent);
Class2 cs2 = new Class2();
cs2.test(ShowEvent);

}




}
}

class2代码



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;

namespace WindowsFormsApp12
{
class Class2
{
// public Action<string> ShowEvent1;
public void test(Action<string> ShowEvent)
{


ShowEvent("123456789");

}

}
}

完!!!