我有一个应用程序(WinForms)。它只是抓取一些数据,对其进行一些处理,然后将结果上传到某个云存储。我现在正在使用一些第三方代码来为我处理云存储的身份验证。此代码将创建一个 WinForm,它承载一个浏览器控件,如果用户尚未为应用程序提供使用云存储的凭据和权限,则会弹出该控件。在我的程序运行并执行它的操作之前,我想确保我已经通过身份验证,因此在程序 (Program.cs) 的 Main() 循环中,我想使用第三方库对云存储进行身份验证并阻止我的实际代码(//myCode)执行,直到它完成。“不幸的是”图书馆是异步的,我今天大部分时间都在试图获得我的行为
所以我有这样的东西
static void Main(string[] args)
{
OAuth.LoginAuthAsync("clientID", "client_secret", ...)
//Don't want to get here until LoginAuthAsync is done
application.run(myForm); //myCode
}
但这会弹出网络浏览器并运行我的代码,我只想在网络 OAuth.LoginAuthAsync 完成后才发生这种情况。
我不是整个 TPL 库的专家,但我花了一段时间在玩一些我认为应该有效但没有用的东西。我试过了:
我试过了
Task.Run(async () =>
{
OAuth.LoginAuthAsync("123456", "asdasd", ...));
).Wait();
在第三方库中引发错误
System.Threading.ThreadStateException:无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”,因为当前线程不在单线程单元中。在 System.Windows.Forms.WebBrowserBase..ctor(String clsidString) 在 System.Windows.Forms.WebBrowser..ctor()
所以我尝试了
Thread tx = new Thread(() => OAuth.LoginAuthAsync("123456","asdasd", ……..));
tx.SetApartmentState(ApartmentState.STA);
tx.Start();
tx.Join();
但这只是弹出窗口并立即消失,然后 //myCode 执行。
任何人都知道我可以在这里做什么。我尝试在myForm _Load事件中移动方法(即从 application.run 调用的 myForm),但我遇到了同样的问题。
非常感谢
PS 我不想使用任何其他第三方库。