使用任务访问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"来工作,但没有成功。这种情况下的问题在哪里?
简单地删除这一行:
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
SynchronizationContext
已在GUI应用程序中设置。
请注意,您可以从Start
方法中删除[STAThread]
属性,因为它在此处不起任何作用。此属性仅在应用程序的入口点(即main
方法)上有效。