5

私は同様の質問があることを知っています:メインスレッドのタスクを続行する

しかし、その質問はwpfに向けられており、コンソールアプリケーションで動作させることはできません。

別のスレッドでメソッドを実行したいのですが、そのメソッドが完了したら、メインスレッドで実行を続けたいと思います。メソッドに参加したくない。とにかくここに私が持っているものがあります:

class Program
{
    static void Main(string[] args)
    {
        Thread.CurrentThread.Name = "MAIN";

        DoWork(x =>
        {
            Console.Write("Method successfully executed. Executing callback method in thread:" +
                "\n" + Thread.CurrentThread.Name);
        });

        Console.Read();
    }

    static void DoWork(Action<bool> onCompleteCallback)
    {
        Console.Write(Thread.CurrentThread.Name); // show on what thred we are executing

        Task doWork = new Task(() =>
        {
            Console.Write(Thread.CurrentThread.Name); // show on what thred we are executing
            Thread.Sleep(4000);
        });

        Action<Task> onComplete = (task) =>
        {                
            onCompleteCallback(true);
        };

        doWork.Start(); 

        // this line gives an error!
        doWork.ContinueWith(onComplete, TaskScheduler.FromCurrentSynchronizationContext());                       
    }
}

メインスレッドでonCompleteCallbackメソッドを実行するにはどうすればよいですか?

4

1 に答える 1

6

しかし、その質問はwpfに向けられており、コンソールアプリケーションで動作させることはできません。

コンソールアプリケーションでは、これを(多くの作業なしで)行うことはできません。コールをスレッドにマーシャリングするためにTPLに組み込まれているメカニズムはすべて、がインストールされているスレッドに依存していますSynchronizationContext。これは通常、ユーザーインターフェイスフレームワークによってインストールされます(つまりApplication.Run、Windowsフォーム、またはWPFのスタートアップコードなど)。

ほとんどの場合、メインスレッドにメッセージループがあり、フレームワークがメッセージをメッセージループに投稿できるため、これは機能します。メッセージループは、ピックアップされてコードを実行します。コンソールアプリケーションでは、これは単なる「生の」スレッドです。メッセージを配置できるメッセージループはありません。

もちろん、独自のコンテキストをインストールすることもできますが、それはおそらく必要ではない多くのオーバーヘッドを追加することになります。


コンソールアプリケーションでは、通常、コンソールスレッドに「戻る」必要はありません。通常、タスクを待つだけです。つまり、次のようになります。

class Program
{
    static void Main(string[] args)
    {
        Thread.CurrentThread.Name = "MAIN";

        Task workTask = DoWork();

        workTask.Wait(); // Just wait, and the thread will continue
                         //  when the work is complete

        Console.Write("Method successfully executed. Executing callback method in thread:" +
                "\n" + Thread.CurrentThread.Name);
        Console.Read();
    }

    static Task DoWork()
    {
        Console.Write(Thread.CurrentThread.Name); // show on what thred we are executing

        Task doWork = new Task(() =>
        {
            Console.Write(Thread.CurrentThread.Name); // show on what thred we are executing
            Thread.Sleep(4000);
        });

        doWork.Start(); 

        return doWork;
    }
}
于 2012-09-05T15:52:24.953 に答える