0

初めてマルチスレッド プログラムを作成しましたが、動作しません。以下は、私がやろうとしていることを描写する、私が思いつくことができる最小の完全なプログラムです。

基本的に、私は以下を作成しました。引数を取らず、文字列を返すデリゲート。前述のデリゲートのメソッド シグネチャに一致する3 つのメソッド ( FirstMessageSecondMessage、および)。ThirdMessage3 つのメソッドを含むこのデリゲートの型のイベント。

最後にStart、イベント内の各メソッドを非同期で実行し、戻り値を表示するメソッドを作成しました。ただし、プログラムは何も出力していません。私は何か誤解していますか?

コードは次のとおりです。

using System;

class Program
{
    delegate string Message();
    static event Message MyMessage;

    static string FirstMessage()
    {
        System.Threading.Thread.Sleep(1000);
        return "Message 1";
    }
    static string SecondMessage()
    {
        System.Threading.Thread.Sleep(2000);
        return "Message 2";
    }
    static string ThirdMessage()
    {
        System.Threading.Thread.Sleep(3000);
        return "Message 3";
    }

    static void Start()
    {
        foreach (Message m1 in MyMessage.GetInvocationList())
        {
            Message m2 = m1;
            m1.BeginInvoke(delegate(IAsyncResult result)
            {
                string msg = m2.EndInvoke(result);
                Console.WriteLine("The message is " + msg + ".");
            }, null);
        }
    }

    static void Main()
    {
        MyMessage += FirstMessage;
        MyMessage += SecondMessage;
        MyMessage += ThirdMessage;

        Start();
    }
}

前もって感謝します!

4

1 に答える 1

2

考えられる理由の 1 つは、プログラムがバックグラウンド タスクの完了を待たずに終了することです。

Mainすべてのバックグラウンド タスクが完了するのをメソッドが待機する方法を追加する必要があります。

トラブルシューティングのために、Start の呼び出しの後にこれを追加してみてください。

Console.ReadLine();

それでメッセージが表示される場合は、これが原因です。

問題のコードはあまりにも不自然で修正できないため、これを正確に解決する方法はわかりません。

于 2013-06-14T21:10:14.153 に答える