.net - 使用 WinForms 进行 MVP 异步调用的最佳实践

标签 .net winforms multithreading mvp

我在 WinForms 项目中使用模型- View -演示者模式,我遇到的一个问题(其中一个)是当表单告诉演示者做某事,然后在演示者去执行操作时没有反应。做吧。幸运的是,在我的项目中,我可以使所有演示者调用异步,但问题是到底如何做到这一点?

是否应该将每个演示者调用包装在新的线程创建中?*

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

这里的最佳实践是什么?如果用户按下“中止你正在做的事情”按钮怎么办?如何优雅地中止?

.* 实际上,我可能只是在演示者上使用某种代理来执行此操作,而不是将线程创建放在 WinForm 中

最佳答案

我通常将任何可能(实际上)花费超过一两秒的操作放入一个单独的任务中,例如:

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();
}

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();
    }

    ...
}

我严重依赖依赖注入(inject)和 IoC 将事物连接在一起。在演示者中,我只需调用类似以下内容:

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

然后连接取消/中止按钮,以便它们告诉任务执行器/任务中止。

它实际上比这里介绍的要复杂一些,但这是总体思路。

关于.net - 使用 WinForms 进行 MVP 异步调用的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/831051/

相关文章:

C# Datagridview - 检查行是否被选中

C++ 流对象线程安全吗?

c# - 如何并行运行多个进程但在每个进程内按顺序执行

c# - 什么是好的、免费的 C# 单元测试覆盖工具?

c# - 如何在 C# 中将 TreeView 项显示为 ListView 项

c# - 如何获取WPF游戏中的当前时间? (无 XNA)

c# - 如何配置应用程序以在具有高 DPI 设置(例如 150%)的机器上正确运行?

c# - 停止使用数据库的线程

c# - 员工 ID 的标准正则表达式

C# Winforms .NET 框架数据处理