C#在无格式应用程序

时间:2017-07-09 15:33:30

标签: c# winforms signalr

我目前正在创建一个无形的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客户端的执行?

1 个答案:

答案 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();
}