【发布时间】:2021-08-12 14:06:57
【问题描述】:
一般:
- WPF 应用程序
- 使用 mahapps.metro
- 使用 mahapps 进度对话框
我想达到什么目的
- 打开 mahapps 进度对话框
- 在进度对话框中做一些事情
- 其中一项工作是打开一个 webbrowser 元素以供用户登录 --> 登录后我会取回 cookie
- 只有在登录程序(任务)之后才做一些事情
当前问题
问题是,我必须为 mahapps 进度对话框创建一个任务,如下所示...
public async void startWork(view)
{
MahApps.Metro.Controls.MetroWindow window = Window.GetWindow(view) as MahApps.Metro.Controls.MetroWindow;
if (window != null)
{
var controller = await window.ShowProgressAsync("Please wait...", "Progress message");
controller.Maximum = 100;
await Task.Run(() => {
Login.RunAuthentification(controller, IDApp, IDToken, BaseUrl);
});
await controller.CloseAsync();
}}
在RunAuthentification中我有一个网页浏览器的功能,看起来像这样
public static async Task<string> openLogin(string _authorizationUrl)
{
string sessionId = null;
if (_authorizationUrl.Length == 0)
{
throw new ArgumentException("Authorization url cannot be empty");
}
// The method should return based on an event.
// We need a Semaphore which we can then be released in the event handler
var signal = new System.Threading.SemaphoreSlim(0, 1);
// Create a WindowsForms window
var window = new System.Windows.Forms.Form
{
Text = "Please provide your login ...",
Size = new System.Drawing.Size(800, 545)
};
// Create a WindowsForms WebBrowser element
var browser = new System.Windows.Forms.WebBrowser
{
Dock = DockStyle.Fill,
Url = new Uri(_authorizationUrl)
};
// Add the browser to the window
window.Controls.Add(browser);
// If the window is closed, release the signal so the async task will be completed
window.Closed += (sender, args) => signal.Release();
// We will listen for any change of the url and wait for the authorization code.
// The browser might be redirected multiple times
browser.DocumentCompleted += (sender, eventArgs) =>
{
Console.WriteLine(eventArgs.Url.ToString());
if (eventArgs.Url.AbsolutePath.EndsWith("/confirmed"))
{
var cookies = browser.Document?.Cookie.Split(';')
.Select(keyValueStr => keyValueStr.Split('='))
.ToDictionary(arr => arr[0].Trim(), arr => arr[1].Trim());
cookies?.TryGetValue("SESSION", out sessionId);
window.Close();
}
};
// Show the window
window.ShowDialog();
// Wait until the signal is set
await signal.WaitAsync();
return sessionId;
}
现在我收到错误消息,我无法访问网络浏览器,因为实际线程不是 STA。有谁知道如何优雅地解决这个问题?
【问题讨论】:
-
你能显示异常的堆栈跟踪吗?
标签: c# wpf task mahapps.metro