繁体   English   中英

关闭在另一个线程中创建的表单

[英]Closing a form that is created in another thread

我一直在寻找我的特定问题的答案,但没有成功。

我的程序中有一个任务需要几秒钟,我想在完成任务时显示一个新表单。 新表单有一个加载栏和一些文本。

我需要显示与任务并行的新表单,否则任务将无法启动,直到我关闭新表单。

这是我现在的解决方案:

private void loadingBar()
{
    frmLoading frm = new frmLoading("Please wait while the database is being backed up", "This might take several days.");
    frm.ShowDialog();  

}

public void Backup()
{
    Thread load = new Thread(new ThreadStart(loadingBar));
    load.Start();

    ///Execute a task.

    load.Abort(); 
}

所以,这个工作正常,但我的问题是:在加载线程中关闭“frm”形式以使其停止不是更好吗?

你可以通过几种方式做到这一点......

1 - 您可以像BendEg建议的那样做,并在准备好后调用frmClose

就像是;

Invoke(new Action(Close)); 

要么

Invoke(new Action(() => frmMain.Close()));

2 - 或者你可以简单地使用后台工作者;

证明这一点的最简单方法是在表单中添加BackgroundWorker,并使用提供的事件;

public Form1()
{
    InitializeComponent();
    backgroundWorker1.RunWorkerAsync();

    MessageBox.Show(@"Please wait while the database is being backed up", @"This might take several days.");
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    Debug.WriteLine("Running"); //Execute a task
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Debug.WriteLine("Ended"); //Dispose of any objects you'd like (close yor form etc.)
}

我希望这有帮助。

您可以在Class-Level上声明表单,然后使用调用将其关闭。 MSDN-Windows窗体调用

像这样:

    public class Class1
{
    private Form myForm;

    public Class1()
    {
        myForm = new Form();
    }

    public void DoSomeWork()
    {
        // ===================================================
        // Do Some Work...
        // ===================================================

        myForm.Invoke(new MethodInvoker(this.Hide));
    }

    public void Hide()
    {
        myForm.Hide();
    }

    public void Backup()
    {
        myForm.ShowDialog();

        Thread load = new Thread(new ThreadStart(DoSomeWork));
        load.Start();
    }
}

我认为这对你有用。

void YourMethod()
{
     WaitForm wf = new WaitForm();
     Invoke(new PleaseWaitDelegate(Launch),wf);
     bool val = BoolMethodDoWork();
     Invoke(new PleaseWaitDelegate(Close), wf);
                if(val)
                {
                    MessageBox.Show("Success!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                    return;
                }
                MessageBox.Show("Damn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
delegate void PleaseWaitDelegate(Form form);
        void Launch(Form form)
        {
            new System.Threading.Thread(()=> form. ShowDialog()).Start();
        }

        void Close(Form form)
        {
            form.Close();
        }

我想这会对你有帮助(如果我理解你的话):

                Parallel.Invoke(() => somemethod(), () =>
                {
                    someothertaskmethod();
                });

我将方法作为示例来演示运行的2个任务。

您需要使用using System.Threading.Tasks;使用正确的using语句using System.Threading.Tasks;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM