2011-08-10 15 views
1

WinFormアプリケーションをコンソールアプリケーションに移行する必要があります。 Winフォームアプリケーションで コンソールアプリケーションで代理人を呼び出す

は、私のようなものを持っている:

this.Invoke(new LogResponseCallback(this.LogResponse), new object[] { allAlarmsJson }); 


    private delegate void LogResponseCallback(string text); 
    private void LogResponse(string response) 
    { 
     this._richTextResponse.Text = response + "\r\n"; 
    } 

は、メインスレッドは、特定の操作の処理後に呼ばれてきたように思えます。

私の懸念は、コンソールアプリケーションで同じ非同期代理コールをどのように達成できるかということです。

ご協力いただければ幸いです。ここでは、事前

+0

コンソールアプリケーションには、SynchronizationContextの派生クラスを動作させるために必要な配管がありません。本質的には、メッセージループを再発明する必要があります。 Consoleクラスはすでにスレッドセーフであるため、コンソールアプリケーションでは問題はほとんどありません。 RichTextBoxをコンソールアプリケーションで使用することは避けてください.Rtfプロパティを操作するときにウィンドウハンドルを作成する傾向があります。それは良くありません。 –

答えて

0

、起動はそれが何をどうするかについて尋ねた質問はあなたが戻ってUIスレッドに取得するためにControl.Invokeを使用したいフォームです非UIスレッド内のUIコントロールにはアクセスできないため、バックグラウンドスレッドから削除する必要があります。

同じ制限がコンソールアプリケーションには適用されません。は、スレッドの問題を回避するためにはまだ注意が必要ですが、同じ問題ではありそうにありません。あなたがやっていることがコンソールにログしているだけなら(例えば、Console.WriteLineで)、バックグラウンドスレッドでロギングするだけでいいはずです。

+0

助けてくれてありがとう。 – CuriousBuddy

+0

助けを借りてくれてありがとう。私はいくつかの心配があります:つまり、私はメソッドを(ここではLogResponseのように)私のコンソールアプリケーションで直接呼び出せるということですか?また、基本的にWindowsのアプリケーションで行われているのは、Http要求を送信し、応答を継続的に受信することです。どのように私はそれを達成することができますか? – CuriousBuddy

+0

@ user739990:LogResponseメソッドはUIコントロールを使用しているようです...おそらくこれ以上はやらないので、何をやっているのでしょうか? 「応答を継続的に受信する」という意味ははっきりしません。複数の同時要求が必要ですか、ループしてデータを取得してログに記録するだけでいいですか? –

0

ここではコード内に非同期代理人を使用していません。this.Invokeは同期呼び出しです。
コンソールアプリケーションを実行している場合は、コールをメインスレッドにマーシャリングする必要はありません。スレッドに依存するコード(winforms、wpf UIスレッド、およびいくつかのCOMコンポーネントなど)を実行しているときのみ実行してください。これらのコンポーネントが作成されたスレッドに依存しているため、これらの状況で呼び出しをマーシャリングするだけで済みます。

+0

それは私のコンソールアプリケーションで直接メソッド(ここではLogResponse)を呼び出すことができるということですか?また、基本的にWindowsのアプリケーションで行われているのは、Http要求を送信し、応答を継続的に受信することです。どのように私はそれを達成することができますか? – CuriousBuddy

+0

あなたの '_richTextResponse' winform UIコントロールとコンソールアプリケーションの間のrelashion shipは何ですか?コンソールアプリケーションを実行したい場合、 '_richTextResponse'を使ってログする必要はありません。これは、WindowsフォームUIコントロールであり、コンソールアプリケーションには関係しないからです。しかし、ここで何を達成しようとしていますか? Windowsフォームアプリケーションを実行している場合、コンソールアプリケーションを起動することができます。方法については、[このリンク](http://stackoverflow.com/questions/2593313/how-to-execute-console-application-from-windows-form)を参照してください。 –

+0

前述のとおり、WinFormアプリケーションをコンソールベースに移行する必要があります。このWinformアプリケーションの作業は、Https要求を送信して応答を取得することです。これは 'code'によって実装されたRealTimeですthis._timer = new System.Threading.Timer(new TimerCallback(GetRealtimeUpdates)、null、-1、-1); 'code' – CuriousBuddy

関連する問題