工作线程:当子表单在工作线程中处于活动状态时禁用父表单

时间:2016-06-03 23:06:16

标签: c# multithreading winforms

我的Windows应用程序有两种形式FormA和formB。

FormA包含一个按钮id,单击该按钮会启动工作线程,如下所示

ngOnDestroy()

上面的工作线程调用一个应该显示<div (window:scroll)="bindToScrollEventFunc()"></div> 的方法,如下所示

btnGet

现在,当工作线程显示 private void cmdGet_Click(object sender, EventArgs e) { if (pdBackgroundWorker.IsBusy == false) { pdBackgroundWorker.RunWorkerAsync(); } } 时,即使我使用FormB方法显示 private void pdBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { var _verifyID = new frmFormB(); _verifyID.ShowDialog(); if (!_verifyID.blnVerified) { return; } else { //do something } } ,其父FormA仍将处于活动状态。

有没有更好的方法来处理这种情况,以便在formB处于活动状态时,应该限制FormA进行访问,就像ShowDialog适用于非线程情况一样?

1 个答案:

答案 0 :(得分:0)

您想使用SynchronizationContext

这是一个例子。

public partial class Form1 : Form
{
    BackgroundWorker _backgroundWorker;

    public Form1()
    {
        InitializeComponent();
        var worker = new Worker(SynchronizationContext.Current);
        _backgroundWorker = new BackgroundWorker();
        _backgroundWorker.DoWork += (sender, e) => worker.DoWork();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (_backgroundWorker.IsBusy == false)
        {
            _backgroundWorker.RunWorkerAsync();
        }
    }
}

public class Worker
{
    private readonly SynchronizationContext _synchronizationContext;

    private Form2 form2;

    public Worker(SynchronizationContext synchronizationContext)
    {
        _synchronizationContext = synchronizationContext;
        form2 = new Form2();
    }

    public void DoWork()
    {
        _synchronizationContext.Send(callback => OpenForm(), null);
    }

    public void OpenForm()
    {
        form2.ShowDialog();

        if (!form2.blnVerified)
        {
            return;
        }
        else
        {
            //do something
        }
    }
}

来自msdn

  

SynchronizationContext类是一个基类,它提供没有同步的自由线程上下文。   此类实现的同步模型的目的是允许公共语言运行库的内部异步/同步操作使用不同的同步模型正常运行。此模型还简化了托管应用程序必须遵循的一些要求,以便在不同的同步环境下正常工作。   同步模型的提供者可以扩展此类并为这些方法提供自己的实现。

希望这有助于:)