相关疑难解决方法(0)

如何使用BackgroundWorker?

我知道它有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?

c# backgroundworker

63
推荐指数
2
解决办法
16万
查看次数

System.Windows.Threading.Dispatcher和WinForms?

是否System.Windows.Threading.Dispatcher适用于WinForms应用程序的UI线程?

如果是,为什么?它来自WindowsBase.dll,它似乎是一个WPF组件.

如果没有,我如何调用工作单元回到UI线程?我发现Control.BeginInvoke(),但创建一个控件只是为了引用原始线程似乎很笨拙.

multithreading dispatcher begininvoke winforms

28
推荐指数
3
解决办法
6万
查看次数

如何从WinForms中的子任务更新UI

我有一个简单的小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'从其创建的线程以外的线程访问.

winforms task-parallel-library

12
推荐指数
2
解决办法
9253
查看次数