C# 后台工作线程未更新UI

C# 后台工作线程未更新UI,c#,wpf,C#,Wpf,我想在WPF应用程序中更新TextBlock的文本。我正在使用一个BackgroundWorker,它对更新方法进行异步调用 编辑: 我在发布前查看了以下问题:后台工作人员暂停的进度条更新。我的问题不同之处在于,我只想在调用可能长期运行的服务调用之前将文本更改为“加载…”。我希望我的实现尽可能可重用,不需要也不能跟踪进度。然后,我打算将文本块文本更改回以前的消息。 我已经在一个新的WPF项目中对问题进行了建模,并且得到了相同的问题。 在datagrid begin单元格编辑事件开始时,文本更改为

我想在WPF应用程序中更新
TextBlock
的文本。我正在使用一个
BackgroundWorker
,它对更新方法进行异步调用

编辑:

我在发布前查看了以下问题:
后台工作人员暂停的进度条更新
。我的问题不同之处在于,我只想在调用可能长期运行的服务调用之前将文本更改为“加载…”。我希望我的实现尽可能可重用,不需要也不能跟踪进度。然后,我打算将文本块文本更改回以前的消息。

我已经在一个新的WPF项目中对问题进行了建模,并且得到了相同的问题。

在datagrid begin单元格编辑事件开始时,文本更改为“Loading…”,并在加载必要的数据时设置回其以前的值

我目前的问题是,文本似乎变为“加载…”,并在单元格开始编辑事件结束时立即返回。我确信两次呼叫之间有很长的时间,甚至尝试
Wait(10000)
。运行时,我看不到“正在加载”文本

我的实现(注意:我已经尝试使用封装删除
,没有更改):

上面的代码在
grdBlah_BeginningEdit中调用,抓取数据后再次调用该代码,并更改文本

void bw_DoWork(object sender, DoWorkEventArgs e)
{
    try
    {
        if (((BackgroundWorker)sender).CancellationPending)
        {
            e.Cancel = true;
            return;
        }

        UpdateDelegate update = new UpdateDelegate(UpdateText);
        this.Dispatcher.BeginInvoke(update, e.Argument);
        // I have also tried: txtSearchCollection.Dispatcher.BeginInvoke(update, e.Argument);
    }
    catch (Exception ex)
    {
        bool brake = true;  // used to apply a breakpoint
    }
}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        try
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            worker.DoWork -= new DoWorkEventHandler(bw_DoWork);
        }
        catch (Exception ex)
        {
            bool brake = true;
        }
    }

private delegate void UpdateDelegate(string s);

private void UpdateText(string s)
{
    txtSelectedCollection.Text = s;
}

非常感谢您的帮助。

您是否看到BackgroundWorker的ProgressChanged事件?它旨在更新用户界面。
RunWorkerCompleted
中有什么内容?当前的
DoWork
方法将立即完成。我认为lambda表达式还远远不够干净。。。Try
bw.DoWork+=(s,e)=>{Try{if((BackgroundWorker)sender).CancellationPending{e.Cancel=true;return;}this.Dispatcher.Invoke((MethodInvoker)(()=>{txselectedCollection.Text=e.Argument;}));}
我将调查ProgressChanged,并使用我的RunWorkerCompleted方法更新问题。谢谢。我建议不要使用BackgroundWorker。请改用
异步
等待
。它更易于使用。
void bw_DoWork(object sender, DoWorkEventArgs e)
{
    try
    {
        if (((BackgroundWorker)sender).CancellationPending)
        {
            e.Cancel = true;
            return;
        }

        UpdateDelegate update = new UpdateDelegate(UpdateText);
        this.Dispatcher.BeginInvoke(update, e.Argument);
        // I have also tried: txtSearchCollection.Dispatcher.BeginInvoke(update, e.Argument);
    }
    catch (Exception ex)
    {
        bool brake = true;  // used to apply a breakpoint
    }
}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        try
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            worker.DoWork -= new DoWorkEventHandler(bw_DoWork);
        }
        catch (Exception ex)
        {
            bool brake = true;
        }
    }

private delegate void UpdateDelegate(string s);

private void UpdateText(string s)
{
    txtSelectedCollection.Text = s;
}