我知道它有3种方法.在我的程序中,我有一个发送消息的方法.这通常很晚,程序有时根本不响应按钮按下发送消息.有时它比我期望的晚5秒,程序冻结.我想使用a BackgroundWorker按预期发送消息,并允许程序始终正常运行.我有用于在按钮处理程序中发送消息的代码.现在我在哪里放这个等效的代码?我希望所有这些仍然可以通过按钮按下来处理.
这是合适的处理程序吗?
backgroundWorker1.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)
并在:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {}
Run Code Online (Sandbox Code Playgroud)
我要把我的代码放在按钮处理程序中?而这之前:
carga.progressBar1.Minimum = 0;
carga.progressBar1.Maximum = 100;
Run Code Online (Sandbox Code Playgroud)
Carga是ProgressBar的另一种形式.如何在此方案中使用BackgroundWorker?
是否System.Windows.Threading.Dispatcher适用于WinForms应用程序的UI线程?
如果是,为什么?它来自WindowsBase.dll,它似乎是一个WPF组件.
如果没有,我如何调用工作单元回到UI线程?我发现Control.BeginInvoke(),但创建一个控件只是为了引用原始线程似乎很笨拙.
我有一个简单的小winforms应用程序,通过TPL任务在另一个线程上执行长时间运行的进程.在这个漫长的运行过程中,我想更新UI(进度条或其他内容).有没有办法这样做而不需要.ContinueWith()?
public partial class Form1 : Form
{
private Task _childTask;
public Form1()
{
InitializeComponent();
Task.Factory.StartNew(() =>
{
// Do some work
Thread.Sleep(1000);
// Update the UI
_childTask.Start();
// Do more work
Thread.Sleep(1000);
});
_childTask = new Task((antecedent) =>
{
Thread.Sleep(2000);
textBox1.Text = "From child task";
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
Run Code Online (Sandbox Code Playgroud)
执行此代码我得到无处不在的异常:
跨线程操作无效:控制'textBox1'从其创建的线程以外的线程访问.