我想在Resharper Test runner的单元测试中调用以下代码。
/// <summary>
/// Function to return the OAuth code
/// </summary>
/// <param name="config">Contains the API configuration such as ClientId and Redirect URL</param>
/// <returns>OAuth code</returns>
/// <remarks></remarks>
[STAThread]
public static string GetAuthorizationCode(IApiConfiguration config)
{
//Format the URL so User can login to OAuth server
string url =
$"{CsOAuthServer}?client_id={config.ClientId}&redirect_uri={HttpUtility.UrlEncode(config.RedirectUrl)}&scope={CsOAuthScope}&response_type=code";
// Create a new form with a web browser to display OAuth login page
var frm = new Form();
var webB = new WebBrowser();
frm.Controls.Add(webB);
webB.Dock = DockStyle.Fill;
// Add a handler for the web browser to capture content change
webB.DocumentTitleChanged += WebBDocumentTitleChanged;
// navigat to url and display form
webB.Navigate(url);
frm.Size = new Size(800, 600);
frm.ShowDialog();
//Retrieve the code from the returned HTML
return ExtractSubstring(webB.DocumentText, "code=", "<");
}
当我这样做我得到以下错误
System.Threading.ThreadStateException : ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment.
at System.Windows.Forms.WebBrowserBase..ctor(String clsidString)
at System.Windows.Forms.WebBrowser..ctor()
1条答案
按热度按时间ruyhziif1#
如果我们在非UI线程上创建一个新的Form,就会出现这个问题。(线程可以从Debug-〉Windows-〉Threads部分进行验证)
我得到了同样的问题,并做了一些分析,发现新的形式是在一个新的线程,而不是在邮件STA线程创建。
为了解决此问题,使用.NET System.Windows.Threading命名空间中的Dispatcher类调用了正在创建新表单的方法,如下所示:
从dispatcher调用你的方法,它将确保在同一个主UI线程上创建表单。
这为我解决了这个问题:-)