设置 task 为 STA 模式

因为要运行窗口代码,必须使用 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();        
        }
上一篇
下一篇