8

私はWinFormsプロジェクトでModel-View-Presenterパターンを使用していますが、(多くの中で)1つの問題は、フォームがプレゼンターに何かをするように指示し、プレゼンターがそれを実行している間、反応しない場合です。幸いなことに、私のプロジェクトでは、すべてのプレゼンター呼び出しを非同期にすることに問題はありません。問題は、それをどのように正確に行うかです。

各プレゼンターの呼び出しは、新しいスレッドの作成でラップする必要がありますか?*

new Thread(()=>_presenter.DoSomething()).Start();

ここでのベストプラクティスは何ですか?ユーザーが[実行中の操作を中止する]ボタンを押した場合はどうなりますか?どうすれば優雅に中絶できますか?

。*現実的には、スレッドの作成をWinFormに配置するのではなく、プレゼンターで何らかのプロキシを使用してこれを実行します。

4

3 に答える 3

5

私は通常、(現実的に) 1 ~ 2 秒以上かかる可能性のあるアクションを、次のような別のタスクに配置します。

public interface ITask
{
    void ExecuteTask (ITaskExecutionContext context);
    void AfterSuccess(ITaskExecutionContext context);
    void AfterFailure(ITaskExecutionContext context);
    void AfterAbortion(ITaskExecutionContext context);
}

このようなタスクを実行するための抽象化もあります。

public interface ITaskExecutor : IDisposable
{
    void BeginTask(ITask task);
    void TellTaskToStop();
}

これの実装の 1 つは、次ITaskExecutorを使用していBackgroundWorkerます。

public class BackgroundTaskExecutor : ITaskExecutor
{
    public void BeginTask(ITask task)
    {
        this.task = task;
        worker = new BackgroundWorker ();
        worker.DoWork += WorkerDoWork;
        worker.RunWorkerCompleted += WorkerRunWorkerCompleted;
        worker.WorkerSupportsCancellation = true;

        worker.RunWorkerAsync();
    }

    ...
}

私は、依存性注入と IoC に大きく依存して、物事を結び付けています。プレゼンターでは、次のように呼び出します。

GoAndDontReturnUntilYouBringMeALotOfMoneyTask task = new GoAndDontReturnUntilYouBringMeALotOfMoneyTask(parameters);
taskExecutor.BeginTask(task);

キャンセル/中止ボタンは配線されているため、タスク実行者/タスクに中止を指示します。

実際には、ここで示したものよりも少し複雑ですが、これが一般的な考え方です。

于 2010-09-06T09:09:55.017 に答える
0

使用するプロキシパターンに、結果を返すか中止するために2、3回のコールバックを受け入れさせてみませんか?

于 2009-05-06T19:09:30.557 に答える