gpt4 book ai didi

c# - 后台工作人员的 UI 访问问题

转载 作者:太空狗 更新时间:2023-10-29 21:51:51 28 4
gpt4 key购买 nike

我正在将一个项目从 Winforms 转移到 WPF。当我的代码基于 WinForms 时,我使用 (this.InvokeRequired) 检查线程是否具有访问权限。现在我基于我的 Mainform 使用以下代码:

    // this is the delegate declaration to Allow Background worker thread to write to Log Output
delegate void LogUpdateCallBack(String LogMessage);

// method to update the Log Window from the Background Thread
public void LogUpdate(String LogMessage)
{
Console.WriteLine("Entering");
if (!Application.Current.Dispatcher.CheckAccess())
{
Console.WriteLine("Thread doesn't have UI access");
LogUpdateCallBack callback = new LogUpdateCallBack(LogUpdate);
Application.Current.Dispatcher.Invoke(callback, LogMessage);
}
else
{
Console.WriteLine("Thread has UI access");
listBox_Output.Items.Add(LogMessage);
Console.WriteLine(LogMessage);
// listBox_Output.TopIndex = listBox_Output.Items.Count - 1;
}
Console.WriteLine("Exiting");
}

我遇到的问题是列表框没有更新。没有错误或异常,我尝试更新其他 UI 控件。 LogMessage 正在写入输出窗口,所以我很困惑。

这是示例控制台输出:

Entering
Thread doesn't have UI access
Entering
Thread has UI access
My LogMessage is output here
Exiting
Exiting
Entering
Thread doesn't have UI access
Entering
Thread has UI access
My LogMessage is output here
Exiting
Exiting

我已经尝试更新其他 UI 控件只是为了检查它是否是我的列表框的问题但没有成功。

除了切换到 CheckAccess() 之外,我在新 WPF 代码中所做的唯一其他主要更改是将在后台工作程序中运行的所有代码都放在另一个类中。我不确定这是否可以问题的一部分?。

--

@JonRaynor

我试过你的想法:

Application.Current.Dispatcher.BeginInvoke(new LogUpdateCallBack(LogUpdate), LogMessage)

但是我的列表框仍然没有更新,如果我输出

Console.WriteLine(listBox_Output);

我看到列表框数组在增长:

System.Windows.Controls.ListBox Items.Count:2020
System.Windows.Controls.ListBox Items.Count:2021
System.Windows.Controls.ListBox Items.Count:2022
System.Windows.Controls.ListBox Items.Count:2023
System.Windows.Controls.ListBox Items.Count:2024
System.Windows.Controls.ListBox Items.Count:2025

但形式没有变化。这非常令人困惑!

最佳答案

我也刚开始使用 WPF,不得不从旧的 WinForms 方式重新学习。我一直在我的屏幕(表单)上使用 BeginInvoke() 和这种类型的语法...

public delegate void WorkCompleted();

/// <summary>
/// Marks the end of the progress
/// </summary>
private void ProgressComplete()
{
if (!this.Dispatcher.CheckAccess())
{
this.Dispatcher.BeginInvoke(new WorkCompleted(ProgressComplete), System.Windows.Threading.DispatcherPriority.Normal, null);
}
else
{
this.buttonClose.Visibility = Visibility.Visible;
this.progressBarStatus.IsIndeterminate = false;
}
}

关于c# - 后台工作人员的 UI 访问问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431828/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com