使用任务访问UI元素

本文关键字:UI 元素 访问 任务 | 更新日期: 2023-09-27 18:25:10

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

    [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"来工作,但没有成功。这种情况下的问题在哪里?

使用任务访问UI元素

简单地删除这一行:

SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());

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

请注意,您可以从Start方法中删除[STAThread]属性,因为它在此处不起任何作用。此属性仅在应用程序的入口点(即main方法)上有效。