6

TCP を介してサーバーに接続する C# コンソール アプリケーションを作成しています。別のスレッドを使用してサーバーからの受信メッセージをリッスンし、同時にコンソールからメッセージを読み取りながら、それらをコンソールに書き込みたいと考えています。私はそれを行うことができましたが、問題があります。

入力中にコンソールに次のメッセージが表示され、メッセージが表示されます。

msg from server
msg from server
my msmsg from server
g to server

そして、私のメッセージをサーバーのメッセージから次のように分離したい:

サーバーからの
メッセージ サーバーからのメッセージ サーバーからの
メッセージ サーバー
への私のメッセージ

メッセージを受信した場合でも、入力したメッセージを保持したいのですが、受信したメッセージと混同したくないので、最後の行で完全なままにしておきたいです。

それをしてもいいですか?そしてどうやって?

サーバーからメッセージが届いたときに、メッセージをコンソールの最後に移動できますか?

4

4 に答える 4

3

これは、ちょっとしたハッカーを使って、標準の .NET コンソール API で実際に可能であると私は信じています。あなたがする必要があるのは、非同期の Read/ReadLine メソッドを作成し (投稿から判断すると、既に行っていると思います)、新しいデータが到着するとすぐにキャンセルできるようにすることです。今のところ、入力を 1 行ずつ送信していると仮定します。「新しいデータ ハンドラー」の擬似コードは次のようになります。

現在の入力バッファを保存します。
現在の非同期読み取りをキャンセルします。
カーソル位置を、新しいデータの最後の書き込みの最後にリセットします。
新しいデータを出力します。
カーソル位置を保存します。
非同期読み取りイベントを再開します。

特に、 Console.CursorLeftおよびConsole.CursorTopプロパティをいじる必要があります。Win32 API コンソール関数と直接やり取りすることでハッカーの一部を回避できる場合がありますが、面倒なことにはならない可能性があります。

それが役立つことを願っています。

于 2009-05-23T17:37:21.460 に答える
1

コンソールを使用して両方のスレッドを同時に停止するには、 lockon someを使用する必要があります。object次のように宣言します。

public static class ThreadSafeConsole
{
    private static object _lockObject = new object();

    public static void WriteLine(string str)
    {
        lock (_lockObject) 
        {
            Console.WriteLine(str);
        }
    }
}

ThreadSafeConsole.WriteLineの代わりに呼び出しますConsole.WriteLine

于 2009-05-23T17:33:54.397 に答える
1

C# の BCL を介して直接これを行うことはできません。ただし、主な選択肢が 2 つあります。

1)これをGUIアプリに変えて、別々の入力/出力領域を用意してください。これは、ユーザーの視点から見ると最も「わかりやすい」オプションですが、コンソール アプリではなく GUI アプリが必要です。

2)コンソール APIに直接P/Invoke します。これにより、コンソールのビューをポイントごとに完全に制御できます。SetConsoleCursorPosition や WriteConsole などを参照してください。

于 2009-05-23T17:21:20.237 に答える
0

私があなたを正しく理解していれば、アプリケーションの「コンソールへの入力」の開始と終了を定義して、それが起こっている間もオブジェクトをロックでき、リスナースレッドからメッセージを挿入しないようにする必要があります入力したテキスト。

public static Object consoleLock = new Object();
public static void Main(string[] args)
{
    lock (consoleLock)
    {
        // now nothing can write to the console (if it's trying to lock onto it)
        Console.WriteLine("Please Input Something");
        // read from console
    }
    // now, your separate thread CAN write to the console - without 
    // interrupting your input process
}
于 2009-05-23T17:39:49.847 に答える