【发布时间】: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