C# 执行简单的逻辑,而不使用;“锁定”;用户界面
我有一个带有txb和按钮的对话框。单击此按钮时,我想更改按钮的文本,禁用按钮,启动一些逻辑,然后关闭窗口 这个逻辑没有返回,它只是设置了一个静态变量。但它可能需要一分钟,因为它连接到一个DBC# 执行简单的逻辑,而不使用;“锁定”;用户界面,c#,winforms,C#,Winforms,我有一个带有txb和按钮的对话框。单击此按钮时,我想更改按钮的文本,禁用按钮,启动一些逻辑,然后关闭窗口 这个逻辑没有返回,它只是设置了一个静态变量。但它可能需要一分钟,因为它连接到一个DB 如何防止WinFroms UI冻结?我正在寻找一种简单的方法,如果可能的话,不需要新的类和文件。您可以有一个执行计算的线程。 这可能会有所帮助:您可以有一个执行计算的线程。 这可能会有所帮助:您可以使用backgroundworker: BackgroundWorker worker = new Backg
如何防止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
toTask.Factory.StartNew
to。我将使用wait/async而不是dispatcher。您可以通过这种方式更好地管理,但我尝试使OP要求的操作保持简单@Andrew@M.kazemAkhgary感谢您保持简单:并且我建议您更喜欢Task.Run
toTask.Factory.StartNew
to。感谢您选择M.kazemAkhbary的解决方案:驻留。事实上我不知道这条路。我会在我自己的项目中使用你的方式!谢谢这实际上更好。使用这种方式@LukasDörigary的确,它看起来非常干净和简单。感谢您为M.kazemAkhbary的解决方案提供了另一种选择:驻留。事实上我不知道这条路。我会在我自己的项目中使用你的方式!谢谢这实际上更好。使用这种方式@LukasDörig确实,它看起来非常干净和简单。