Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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
C# 在两个等待语句之间更新UI_C#_Wpf_Async Await - Fatal编程技术网

C# 在两个等待语句之间更新UI

C# 在两个等待语句之间更新UI,c#,wpf,async-await,C#,Wpf,Async Await,我试图在一个(相当简单的)应用程序中实现异步等待功能。 我的目标是在等待之间更新busyIndicator 我不知道是什么,但我认为在我对异步等待的理解中缺少了一些必要的东西 private async void StartTest(object obj) { try { this.IsBusy = true; this.BusyMessage = "Init..." await Task.Delay(7000);

我试图在一个(相当简单的)应用程序中实现异步等待功能。 我的目标是在等待之间更新busyIndicator

我不知道是什么,但我认为在我对异步等待的理解中缺少了一些必要的东西

private async void StartTest(object obj)
{
    try
    {
        this.IsBusy = true;
        this.BusyMessage = "Init..."

        await Task.Delay(7000);


        var getData1Task = this.blHandler.GetData1Async();
        this.BusyMessage = "Retreiving data...";

        this.result1 = await getDeviceInfoTask;
        this.result2 = await this.blHandler.GetData2Async();

        this.BusyMessage = "Searching...";

        this.result3 = await this.blHandler.GetData3();
    }
    finally
    {
        this.IsBusy = false;
        this.BusyMessage = string.empty;
    }
}
busyIndicator具有与
IsBusy
BusyMessage
的绑定。 在执行这段代码时,我确实得到了显示“Init…”的busyIndicator,但它从未更改为“retrieving data…”或“search…”。
更糟糕的是:当执行最后一个
GetData3

时,ui完全冻结,
GetData1Async
GetData2Async
GetData3
都是同步方法(也就是说,我猜当它们返回
任务时,它们会同步完成所有工作)。在这种情况下,
wait
s不会挂起该方法(因为返回的
任务
将是一个已完成的任务)。因此,该方法将作为一个大型同步方法一直持续下去,UI将永远不会有机会更新(因为在此期间它不会输出任何消息)


如果您不想猜测,请向我们展示这三种方法的代码。

最有可能的是
GetData1Async
GetData2Async
GetData3
都是同步方法(也就是说,我猜虽然它们确实返回了
任务,但它们是同步完成所有工作的)。在这种情况下,
wait
s不会挂起该方法(因为返回的
任务
将是一个已完成的任务)。因此,该方法将作为一个大型同步方法一直持续下去,UI将永远不会有机会更新(因为在此期间它不会输出任何消息)


如果您不想猜测,请向我们展示这三种方法的代码。

听起来您实际上想在后台线程上执行同步方法,然后在UI代码中异步等待它完成

这正是
Task.Run()所做的。

它需要一个委托在线程池中运行,然后返回一个
wait
able任务,该任务将为您提供结果。

听起来您实际上想要在后台线程上执行同步方法,然后在UI代码中异步等待它完成

这正是
Task.Run()所做的。

它需要一个委托在线程池中运行,然后返回一个
等待
可执行的任务,该任务将为您提供结果。

请尝试按Dispatcher之类的方式推送消息

    App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
                        { this.BusyMessage = "Retreiving data..."; }));

    // Do Something 


   App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
                    { this.BusyMessage = "Filtering  data..."; }));

   // Do Something

你们可以试着像调度员一样推送消息吗

    App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
                        { this.BusyMessage = "Retreiving data..."; }));

    // Do Something 


   App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
                    { this.BusyMessage = "Filtering  data..."; }));

   // Do Something

这是一份工作副本,上面有我的一些假设。希望能有帮助。我在运行的WPF应用程序中测试了它。请注意,您发布的内容中没有任何保护,以确保这不是“双重运行”(我们可以启动,而不管IsBusy的值如何,StartTest可能应该确保这一点)

公共类堆栈:ViewModelBase
{
私有类MyHandler
{
专用异步任务GetDataAsync(字符串结果)
{
返回等待任务。运行(()=>
{
睡眠(5000);
返回结果;
});
}
公共异步任务GetData1Async()
{
返回等待GetDataAsync(“Data1”);
}
公共异步任务GetData2Async()
{
返回等待GetDataAsync(“Data2”);
}
公共异步任务GetData3()
{
返回等待GetDataAsync(“Data3”);
}
}
私有布尔正忙{get;set;}
私有字符串_message=“”;
公共字符串业务消息
{
获取{return\u message;}
设置{u message=value;RaisePropertyChanged(“BusyMessage”);}
}
private MyHandler blHandler=new MyHandler();
私有任务getDeviceInfo任务;
私有字符串result1{get;set;}
私有字符串result2{get;set;}
私有字符串result3{get;set;}
公共工程()
{
GetDeviceInfo任务=任务。运行(()=>
{
返回(“设备信息”);
});
}
公共异步void开始测试(对象obj)
{
尝试
{
this.IsBusy=true;
this.BusyMessage=“Init…”;
等待任务。延迟(7000);
var getData1Task=/*this*/await/*缺少*/this.blHandler.GetData1Async();
this.BusyMessage=“检索数据…”;
//假设这是Task.Run,将其放入构造函数中
this.result1=getDeviceInfo任务/*此*/.Result/*缺失*/;
this.result2=等待此.blHandler.GetData2Async();
this.BusyMessage=“搜索…”;
//这有点令人困惑,因为名称并不意味着它是
//异步,但它正在等待
this.result3=等待此.blHandler.GetData3();
}
最后
{
this.IsBusy=false;
this.BusyMessage=string.Empty;
}
}
}

这是一份工作副本,上面有我的一些假设。希望能有帮助。我在运行的WPF应用程序中测试了它。请注意,您发布的内容中没有任何保护,以确保这不是“双重运行”(我们可以启动,而不管IsBusy的值如何,StartTest可能应该确保这一点)

公共类堆栈:ViewModelBase
{
私有类MyHandler
{
专用异步任务GetDataAsync(字符串结果)
{
返回等待任务。运行(()=>
{
睡眠(5000);
返回结果;
});
}
公共异步任务GetData1Async()
{
返回等待GetDataAsync(“Data1”);
}
公共异步任务GetData2Async()
{
返回等待GetDataAsync(“Data2”);
}
公共异步任务GetData3()
{
返回等待GetDataAs