【问题标题】:Accessing UI elements with a task使用任务访问 UI 元素
【发布时间】:2015-11-30 19:18:56
【问题描述】:

我有以下启动方法,它实际上启动了一个任务:

    [STAThread]
    public void Start()
    {
        if (!this.cancellationToken.IsCancellationRequested)
        {                
            SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
            this.t = Task.Factory.StartNew(
            () =>
            {
                var grid = new Grid
                {
                    Width = 200,
                    Height = 2000
                };                       
            }, 
            this.cancellationToken, 
            TaskCreationOptions.None, 
            TaskScheduler.FromCurrentSynchronizationContext());
            this.log.LogDebug(string.Format(CultureInfo.InvariantCulture, "Task " + this.TaskId + " is started"));
        }
        else
        {
            this.log.LogDebug(string.Format(CultureInfo.InvariantCulture, "Cancellation is requested, Task " + this.TaskId + " will not start"));
        }          
    }

并且我已将 TaskScheduler 定义为“FromCurrentSynchronizationContext,因为我希望任务执行并访问 UI 元素(网格)以检查它是否具有权限,但我收到以下错误:

The calling thread must be STA, because many UI components require this

我认为它可以通过将 TaskScheduler 设置为“FromSynchronizationContext”来工作,但没有运气。这种情况下的问题在哪里?

【问题讨论】:

  • 你在哪里启动你的用户界面,它没有显示在这段代码中?
  • var grid = new Grid { 宽度 = 200, 高度 = 2000 };是一个 UI 元素
  • 是的,我很难理解你在那里做什么;但我认为这里的问题是该代码的效果是尝试后台线程初始化UI。而你不能这样做,你必须从主 STAThread 初始化 UI,我怀疑如果你把 var x = new MainForm(); x.Show() 扔在那里,问题就会消失。
  • 您正在尝试在线程池线程中创建 UI 组件。你的主要目的是什么?
  • 我只想检查是否有办法让任务初始化 UI 元素。我只是不知道该怎么做。我什至使用过调度程序,但没有运气。

标签: c# .net multithreading task-parallel-library task


【解决方案1】:

简单地说,删除这一行:

SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());

SynchronizationContext 已在 GUI 应用程序中设置。

请注意,您可以从Start 方法中删除[STAThread] 属性,因为它在这里什么都不做。该属性仅在应用程序的入口点有效,即main 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多