在不“锁定”UI的情况下执行简单逻辑

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

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

如何从Freezing中停止WinFroms UI? 我正在寻找一种简单的方法,如果可能的话,没有新的类和文件。

这就是我要做的事情:

 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:

 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,则需要调度程序。例如,如果要更改新线程内的按钮。

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

您可以拥有执行计算的thread 。 这可能有所帮助: CSharp中的线程