当前位置: 首页 > 知识库问答 >
问题:

使用异步访问UI控制UI线程

谭曦
2023-03-14

我正在编写一个WPF表单应用程序,在其中我试图循环通过一个文件夹并实时显示其文件,使用异步等待方法。在我的任务中。运行()方法我正在引发我的事件,这会引发罚款,但是事件代码也会更新UI线程上的文本框,因此我UI线程错误

'调用线程无法访问此对象,因为另一个线程拥有它。'

.有什么方法可以更改我的代码,以便我可以更新我的TextBox?

    private delegate void GetFilesCount(string f);
    private event GetFilesCount onFileCount;


    private void Btn_Compare_Click(object sender, RoutedEventArgs e)
    {
        onFileCount += FileCount;
        CountFilesAsync();
    }


    function async void CountFilesAsync() {
            await Task.Run(()=> {
                System.IO.DirectoryInfo myDir = new System.IO.DirectoryInfo(path);
                foreach (FileInfo item in myDir.GetFiles())
                {
                    onFileCount(item.Name); // This is an EVENT
                } 

            });
}

和我的事件处理程序代码

    private void FileCount(string fileName)
    {
            txtLabel_Log.Text = fileName;   // < -- Calling Method UI Error
    }

共有2个答案

符畅
2023-03-14

4.5中的异步:在异步API中启用进度和取消

private void Btn_Compare_Click(object sender, RoutedEventArgs e)
{
    CountFilesAsync(Progress<string>(FileCount));
}

private async void CountFilesAsync(IProgress<string> progress)
{
    await Task.Run(() =>
        {
            System.IO.DirectoryInfo myDir = new System.IO.DirectoryInfo(path);
            foreach (FileInfo item in myDir.GetFiles())
            {
                progress(item.Name); // report progress
            } 
        });
}
谷梁智
2023-03-14

不确定这是否对您有帮助,但您可以尝试调用应用程序调度程序。

private void FileCount(string fileName)
{
        Application.Current.Dispatcher.Invoke(() => {
            txtLabel_Log.Text = fileName;   // < -- Calling Method UI Error
        });
}
 类似资料:
  • 我正在使用MVC模式开发一个WinForms应用程序。我是否应该从控制器访问UI组件,例如treeview节点? 我想访问一个treeview选择的节点并改变它的标记之类的东西,我应该从controller访问它还是违反MVC的原则? 唯一让我恼火的是treenode属于名称空间,并且从MVC透视图/表单相关组件应该只在视图中使用,所以我才问。

  • 我在robolectric(Version1.1)测试案例中获取主UI线程时遇到了麻烦。我正在测试的应用程序方法中有以下检查:

  • 通过向代码中添加以下类,我向现有springboot REST API中添加了一个简单的招摇过市UI: 我的问题是,API应该是公共的,但招摇过市的文档不应该是公共的。我想要一种请求对swagger文档进行身份验证的方法,有人知道实现这一点的简单方法吗? 我试着用谷歌搜索它,但我只能找到誓言的东西,但这是endpoint的身份验证,而不是招摇过市的文档。。。

  • 每个用户界面都考虑以下三个主要方面 - UI elements - 这些是用户最终看到并与之交互的核心可视元素。 JavaFX提供了大量广泛使用的常用元素列表,从基本到复杂,我们将在本教程中介绍。 Layouts - 它们定义了如何在屏幕上组织UI元素,并为GUI(图形用户界面)提供最终外观。 这部分将在布局章节中介绍。 Behavior - 这些是用户与UI元素交互时发生的事件。 这部分将在“事

  • 我对平台有几个问题。稍后运行。我有一个JavaFX应用程序类。在这个类中,我运行一个线程(线程从网络套接字读取数据)。 现在,当我在线程中创建一个新的时,系统会抛出一个执行(JavaFX事件调度器线程和我的netork-read线程不一样)-我理解这种行为。 但另一方面,我将来自网络阅读器的文本附加到现有的文本区域,或者在列表视图中添加/删除一些项目 我的问题: JavaFX事件调度器线程何时引发

  • 我想从一个长期运行的方法状态更新。通常我会使用dispatcher回发到UI线程,但我对使用async Await很好奇。 为了简单起见: 但这是Fugly。此外,如果您去掉async和await关键字并将其替换为task.waitall,它仍将按预期执行。 注意:如果您想知道为什么我使用thread.sleep而不是task.delay,我实际上也在Silverlight中测试了这一点,异步等待