2017-07-09 17 views
0

私は現在、SignalRクライアントとして動作するフォームレスC#アプリケーションを作成しています。目標は、クライアントがバックグラウンドでサイレントモードで実行され、SignalRによってトリガーされたときにフォームを表示することです。C#フォームレスアプリケーションから別のスレッドでフォームを作成します。

現在、GUIを表示する際に問題が発生しています。 -

private static void ShowForm() 
{ 
    var alertForm = new AlertForm(); 
    alertForm.Show(); 
} 

これが最初で正常に動作します:SignalRを非同期に実行する必要がある、と私は非同期Main()メソッドを持つことができないので、私は現在、これはShowFormを方法である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を呼び出すと、ハブに接続し、showForm()メソッドを呼び出します。ただし、フォームはレンダリングされず、応答なしとして表示されません。 .ShowDialogを呼び出すと、フォームが実際にレンダリングされますが、SignalRクライアントはハブの受信を停止します。

したがって、フォームを別のスレッドで実行し、SignalRクライアントの実行をブロックしないようにフォームを表示するにはどうすればよいですか?

答えて

2

コードに問題があります。 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(); 
} 
+1

ありがとう、ありがとう! – TeknoVenus

関連する問題