Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在UI线程上运行BeginInvoke中断代码?_C#_.net_Winforms_Multithreading - Fatal编程技术网

C# 是否可以在UI线程上运行BeginInvoke中断代码?

C# 是否可以在UI线程上运行BeginInvoke中断代码?,c#,.net,winforms,multithreading,C#,.net,Winforms,Multithreading,假设我有一些在UI线程中运行的代码,它生成一个新线程在后台执行工作,然后继续执行UI工作。后台工作完成后,将从新线程调用BeginInvoke。如果UI工作仍在进行中,那么给BeginInvoke的回调会中断UI工作,还是会等待 代码示例-将名为button1的按钮添加到表单中,并将button1\u Click添加到其Click事件中,然后将其添加到表单中: bool continueWork = true; private void button1_Click(object sender,

假设我有一些在UI线程中运行的代码,它生成一个新线程在后台执行工作,然后继续执行UI工作。后台工作完成后,将从新线程调用BeginInvoke。如果UI工作仍在进行中,那么给BeginInvoke的回调会中断UI工作,还是会等待

代码示例-将名为button1的按钮添加到表单中,并将button1\u Click添加到其Click事件中,然后将其添加到表单中:

bool continueWork = true;

private void button1_Click(object sender, EventArgs e)
{
    Thread workThread = new Thread(performBackgroundWork);

    workThread.IsBackground = true;
    workThread.SetApartmentState(ApartmentState.STA);
    workThread.Start();

    for (long i = 0; i < long.MaxValue; i++)
    {
        if (!continueWork)
            break;

        button1.Text = i.ToString();
    }
}

private void performBackgroundWork()
{
    Thread.Sleep(1);
    button1.BeginInvoke(new MethodInvoker(stopUIWork));            
}

private void stopUIWork()
{
    continueWork = false;
}
bool continueWork=true;
私有无效按钮1\u单击(对象发送者,事件参数e)
{
螺纹工作螺纹=新螺纹(PerformBackFoundation);
workThread.IsBackground=true;
SetApartmentState(ApartmentState.STA);
workThread.Start();
for(长i=0;i

单击按钮1后的文本是什么?

BeginInvoke将代理添加到队列(确切地说是消息队列)。所以答案是否定的,他们不会被打断。您的按钮点击处理程序实际上也是由于消息队列中的消息而执行的


编辑:对不起,我忘了回答你的第二个问题,但你可以自己解决。按钮文本将为long.MaxValue-1。您可能希望在不使用BeginInvoke的情况下执行
stopUIWork

BeginInvoke将委托添加到队列(确切地说是消息队列)。所以答案是否定的,他们不会被打断。您的按钮点击处理程序实际上也是由于消息队列中的消息而执行的

编辑:对不起,我忘了回答你的第二个问题,但你可以自己解决。按钮文本将为long.MaxValue-1。您可能希望在不使用BeginInvoke的情况下执行
stopUIWork