lor*_*ert 10 c# multithreading winforms
似乎奥利弗是对的.几次尝试后,我得到了异常,在调试模式下我得到了它.所以这一切都与时间有关.你还应该检查马修瓦特森的答案;)
首先是一个可以解释我困惑的小例子.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace testCrossThreading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new Thread(ThreadJob).Start();
}
void ThreadJob()
{
//label1.Text = "1";
changeText(label1, "1");
}
void changeText(Label L, String message)
{
L.Text = message;
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在我的问题是:如果我label1.Text = "1";在函数"ThreadJob"中取消注释,那么我会按预期得到一个Cross线程异常.但如果我留下评论,如示例所示它确实有效.但为什么?该子函数调用该函数,我不调用任何东西.所以它仍然是子线程,而不是改变标签imo文本的GUI线程.或者我错过了什么?
我会这样写的.
void ThreadJob()
{
Action a = () => label1.Text = "1";
this.Invoke(a);
}
Run Code Online (Sandbox Code Playgroud)
我认为这只是一个时间问题.如果您尝试从非gui线程更新gui元素,则可以抛出跨线程异常.您甚至可以通过调用禁用整个跨线程异常
Form.CheckForIllegalCrossThreadCalls = false;
Run Code Online (Sandbox Code Playgroud)
但是在异常消失之后,进一步的行为是未定义的,并且可能导致非常微妙的错误.因此,将异常作为代码气味的提示,但请注意,即使应该是异常,也不会抛出异常.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |