Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 如何测试Windows窗体应用程序中长时间运行的后台进程的用户体验?_Winforms_Mvp_User Experience - Fatal编程技术网

Winforms 如何测试Windows窗体应用程序中长时间运行的后台进程的用户体验?

Winforms 如何测试Windows窗体应用程序中长时间运行的后台进程的用户体验?,winforms,mvp,user-experience,Winforms,Mvp,User Experience,我正在开发一个.NET Windows窗体应用程序。 我使用模型视图演示者设计模式, 更准确地说,是监控控制器 我的应用程序中的演示者执行后台操作, 这可能需要几秒钟(或更长时间)才能完成。 后台进程完成后,演示者调用视图上的调用, 向其传递呈现/更新表单所需的所有数据。 这一切都很好 现在,我想能够测试用户体验, 关于这些长期运行的后台进程。 例如,我想看看UI的外观和行为, 当一个或多个后台进程正在运行时 为此,我在演示者中加入了一些Thread.Sleep(..)调用, 由#IF DEBU

我正在开发一个.NET Windows窗体应用程序。 我使用模型视图演示者设计模式, 更准确地说,是监控控制器

我的应用程序中的演示者执行后台操作, 这可能需要几秒钟(或更长时间)才能完成。 后台进程完成后,演示者调用视图上的调用, 向其传递呈现/更新表单所需的所有数据。 这一切都很好

现在,我想能够测试用户体验, 关于这些长期运行的后台进程。 例如,我想看看UI的外观和行为, 当一个或多个后台进程正在运行时

为此,我在演示者中加入了一些Thread.Sleep(..)调用, 由
#IF DEBUG
编译符号包围。 我不喜欢这样,因为它会弄乱我的代码, 它很难维护,并且很容易泄漏到生产代码中

您有更好的解决方案来测试用户体验吗
关于winforms应用程序中长时间运行的后台进程?

我仍然对任何答案感兴趣,但现在我将发布我当前的解决方案

演示者现在不再从演示者内部启动后台进程,而是将其委托给ActionManager

如果我想测试ux,我使用ActionManager运行应用程序,该应用程序在执行命令之前有一秒的延迟。这允许我检查ui的行为

这解决了我的问题。演示者现在看起来像这样:

internal class ItemListPresenter : IItemListPresenter
{
    // member variables 
    // ...
    public ItemListPresenter(IItemListView itemListView, IActionManager cmdManager)
    {
        _view = itemListView;
        _mngr = cmdManager;
        _syncCtxt = SynchronizationContext.Current; // let's assume we're constructed from the UI thread.
    }

    // IItemListPresenter method:
    public void StartLoadingItemsSession()
    {
        ShowBusy();
        ClearResults();
        _mngr.Post(LoadItems);
    }

    // ...

    private void LoadItems()
    {
        UpdateViewWith(GetItems());
        SetReady();
    }

    // ...
    // IItemListView method
    private void UpdateViewWith(Item[] newItems)
    {
        _syncCtxt.Post(state => _view.AddResults(newItems), newItems);
    }

    // ...
}

我认为,这个解决方案有更好的关注点。