我的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
适用于非线程情况一样?
答案 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类是一个基类,它提供没有同步的自由线程上下文。 此类实现的同步模型的目的是允许公共语言运行库的内部异步/同步操作使用不同的同步模型正常运行。此模型还简化了托管应用程序必须遵循的一些要求,以便在不同的同步环境下正常工作。 同步模型的提供者可以扩展此类并为这些方法提供自己的实现。
希望这有助于:)