因为要运行窗口代码,必须使用 STA 模式,而有一些代码又需要 async/await
方式 一
推荐,因为可以传入一个异步函数,并可以扩展为带返回值
# 调用 await this.RunWithStaTaskAsync(this.AppRun);
private async Task RunWithStaTaskAsync(Func<Task> func)
{
var task = Task.Factory.StartNew(
async () => { await func(); },
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
await task;
await task.Result;
}
方式 二
简单的同步转异步的方法, 传入一个同步的方式, 然后使用异常的方式进行调用
public static async Task<T> StartSTATask<T>(Func<T> func)
{
var tcs = new TaskCompletionSource<T>();
var thread = new Thread(() =>
{
try
{
tcs.SetResult(func());
}
catch (Exception e)
{
tcs.SetException(e);
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return await tcs.Task;
}
运行代码模拟
private async Task AppRun()
{
await Task.Delay(TimeSpan.FromSeconds(1));
Form form = new Form();
form.StartPosition = FormStartPosition.CenterScreen;
form.TopMost = true;
form.Size = new Size(100, 100);
form.Text = "测试";
form.ShowDialog();
}