我目前正在创建一个无形的C#应用程序,它将充当SignalR客户端。目标是让客户端在后台静默运行,并在SignalR触发时显示一个表单。
目前,我遇到了显示GUI的问题。由于SignalR需要异步运行,而我不能使用异步Main()
方法,因此我目前必须使用Task.ContinueWith
static void Main()
{
_url = "https://localhost:44300";
var hubConnection = new HubConnection(_url);
var hubProxy = hubConnection.CreateHubProxy("HubName");
hubConnection.Start().ContinueWith(task =>
{
if (task.IsFaulted)
{
MessageBox.Show("There was an error opening the connection");
}
else
{
Trace.WriteLine("Connection established");
}
}).Wait();
hubProxy.On("showForm", showForm);
Application.Run();
}
这是showForm方法:
private static void ShowForm()
{
var alertForm = new AlertForm();
alertForm.Show();
}
这首先工作正常 - 它连接到集线器,当我从服务器调用showForm()
时调用showForm
方法。但是,表单永远不会呈现并显示为无响应。调用.ShowDialog
将意味着表单实际呈现,但SignalR客户端停止侦听集线器。
那么,我怎样才能显示表单,使其在单独的线程上运行并且不会阻止我的SignalR客户端的执行?
答案 0 :(得分:2)
您的代码存在问题;虽然您在 Main 中使用 Application.Run 创建了一个消息循环,但 hubProxy.On 在另一个线程上执行。 最简单的解决方案是使用自己的消息循环在自己的线程中运行AlertForm的每个实例。
private static void ShowForm()
{
var t = new Thread(() =>
{
var alertForm = new AlertForm();
alertForm.Show();
Application.Run(alertForm); //Begins running a standard application message loop on the current thread, and makes the specified form visible.
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
}