如上图所示,报错“从不是创建控件的线程访问它” ,该报错主要出现在异步方法中,意思就是主方法线程号是1,异步方法线程号是3,控件是在线程1的主窗体构造函数中创建的,在线程3中就不能去访问它。如果要访问它可以使用this.invoke方法。代码如下:
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 delegate void ShowMessageDelegate(string txt);
public partial class Form1 : Form
{
/// <summary>
/// 显示消息的委托
/// </summary>
private ShowMessageDelegate showMessageDelegate = null;
public void Addmessage(string message)
{
this.Invoke(showMessageDelegate, new object[] { message });
}
public Form1()
{
InitializeComponent();
showMessageDelegate = new ShowMessageDelegate(ShowMessage);
}
/// <summary>
/// 显示消息
/// </summary>
/// <param name="txt"></param>
private void ShowMessage(string txt)
{
richTextBox1.AppendText(txt + "\r\n");
}
private void button1_Click(object sender, EventArgs e)
{
Addmessage("111 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId);
AsyncMethod();
Addmessage("222 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId);
}
private async Task AsyncMethod()
{
var ResultFromTimeConsumingMethod = TimeConsumingMethod();
string Result = await ResultFromTimeConsumingMethod + " + AsyncMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId;
Addmessage(Result);
//返回值是`Task`的函数可以不用`return`,或者将`Task`改为void
}
//这个函数就是一个耗时函数,可能是`IO`操作,也可能是`cpu`密集型工作。
private Task<string> TimeConsumingMethod()
{
var task = Task.Run(() => {
Addmessage( "Helo I am TimeConsumingMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId ); //richTextBox1.AppendText("Helo I am TimeConsumingMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
Addmessage("Helo I am TimeConsumingMethod after Sleep(5000). My Thread ID is :" + Thread.CurrentThread.ManagedThreadId );
return "Hello I am TimeConsumingMethod";
});
return task;
}
}
}