C# 执行简单的逻辑,而不使用;“锁定”;用户界面

C# 执行简单的逻辑,而不使用;“锁定”;用户界面,c#,winforms,C#,Winforms,我有一个带有txb和按钮的对话框。单击此按钮时,我想更改按钮的文本,禁用按钮,启动一些逻辑,然后关闭窗口 这个逻辑没有返回,它只是设置了一个静态变量。但它可能需要一分钟,因为它连接到一个DB 如何防止WinFroms UI冻结?我正在寻找一种简单的方法,如果可能的话,不需要新的类和文件。您可以有一个执行计算的线程。 这可能会有所帮助:您可以有一个执行计算的线程。 这可能会有所帮助:您可以使用backgroundworker: BackgroundWorker worker = new Backg

我有一个带有txb和按钮的对话框。单击此按钮时,我想更改按钮的文本,禁用按钮,启动一些逻辑,然后关闭窗口

这个逻辑没有返回,它只是设置了一个静态变量。但它可能需要一分钟,因为它连接到一个DB


如何防止WinFroms UI冻结?我正在寻找一种简单的方法,如果可能的话,不需要新的类和文件。

您可以有一个执行计算的
线程。

这可能会有所帮助:

您可以有一个执行计算的
线程。

这可能会有所帮助:

您可以使用backgroundworker:

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = false;
worker.WorkerReportsProgress = false;

worker.DoWork += (s, e) =>
    {
        //perform action
    };

worker.RunWorkerCompleted += (s, e) =>
    {
        //close window
    };

worker.RunWorkerAsync();

有关更多详细信息,请参阅。

您可以使用backgroundworker:

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = false;
worker.WorkerReportsProgress = false;

worker.DoWork += (s, e) =>
    {
        //perform action
    };

worker.RunWorkerCompleted += (s, e) =>
    {
        //close window
    };

worker.RunWorkerAsync();

有关详细信息,请参阅。

单击按钮时:

button.Enabled = false;
button.Text = "new text";
Task.Factory.StartNew(() =>
{
    // do your tasks here and close the window.
    // type your code normally like calling methods. setting variables etc...

    StaticVariable = ExampleUsingMethod();
});
如果以后需要将变量分配给UI,则需要dispatcher。例如,如果要更改新线程中的按钮

Task.Factory.StartNew(() =>
{
       Dispatcher.Invoke(() => 
       {
          button.Enabled = false;
          button.Text = "new text";
       }

       StaticVariable = ExampleUsingMethod();
});

单击按钮时:

button.Enabled = false;
button.Text = "new text";
Task.Factory.StartNew(() =>
{
    // do your tasks here and close the window.
    // type your code normally like calling methods. setting variables etc...

    StaticVariable = ExampleUsingMethod();
});
如果以后需要将变量分配给UI,则需要dispatcher。例如,如果要更改新线程中的按钮

Task.Factory.StartNew(() =>
{
       Dispatcher.Invoke(() => 
       {
          button.Enabled = false;
          button.Text = "new text";
       }

       StaticVariable = ExampleUsingMethod();
});

下面是我要做的:

private async void ButtonClick() 
{
    //here, you're on the UI Thread
    button1.Enabled = false;

    await Task.Run(() => DoTheWork());

    //you're back on the UI Thread
    button1.Enabled = true;
}

private void DoTheWork() 
{
    //this will be executed on a different Thread
}

下面是我要做的:

private async void ButtonClick() 
{
    //here, you're on the UI Thread
    button1.Enabled = false;

    await Task.Run(() => DoTheWork());

    //you're back on the UI Thread
    button1.Enabled = true;
}

private void DoTheWork() 
{
    //this will be executed on a different Thread
}


看看这个:
BackgroundWorker
maybe?上一季的后台工作人员太多了,有更好的技术存在,但为什么没有呢。大多数(全部?)DB提供程序都以某种形式支持异步编程。您应该检查一下。@Andrew我通过一个从接口获取数据的类访问DB/数据源。有点复杂,但我不仅仅从数据库中获取数据。如果不确定每个实现都支持异步,我将不得不对代码进行一次大的重构。看看这个:
BackgroundWorker
也许吧?上一季的后台工作人员太多了,有更好的技术存在,但为什么不存在呢。大多数(所有?)DB提供程序都以某种形式支持异步编程。您应该检查一下。@Andrew我通过一个从接口获取数据的类访问DB/数据源。有点复杂,但我不仅仅从数据库中获取数据。我必须对代码进行一次大的重构,而不能确定每个实现都支持异步。12年后,确实有了更好的资料来源。这是2003年的一篇文章。12年后会有更好的资源,真的。我们有TPL/await/async/etc。我建议使用任务。我们有TPL/await/async/etc。我建议使用任务。我会使用await/async而不是dispatcher。你可以用这种方式更好地管理,但我试着对OP的要求保持简单@Andrew@M.kazemAkhgary感谢您保持它的简单性:并且我建议您更喜欢
Task.Run
to
Task.Factory.StartNew
to。我将使用wait/async而不是dispatcher。您可以通过这种方式更好地管理,但我尝试使OP要求的操作保持简单@Andrew@M.kazemAkhgary感谢您保持简单:并且我建议您更喜欢
Task.Run
to
Task.Factory.StartNew
to。感谢您选择M.kazemAkhbary的解决方案:驻留。事实上我不知道这条路。我会在我自己的项目中使用你的方式!谢谢这实际上更好。使用这种方式@LukasDörigary的确,它看起来非常干净和简单。感谢您为M.kazemAkhbary的解决方案提供了另一种选择:驻留。事实上我不知道这条路。我会在我自己的项目中使用你的方式!谢谢这实际上更好。使用这种方式@LukasDörig确实,它看起来非常干净和简单。