Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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# 连接时显示ProgressRing_C#_Xaml_Windows Runtime_Winrt Xaml - Fatal编程技术网

C# 连接时显示ProgressRing

C# 连接时显示ProgressRing,c#,xaml,windows-runtime,winrt-xaml,C#,Xaml,Windows Runtime,Winrt Xaml,在我的程序中,我有一个计时器,当它计时到0时,我希望我的应用程序“连接”到一个服务,当它“连接”时,让它显示一个进度环 似乎我的进度环在设置为活动状态的功能结束之前不会被“激活”。但由于我正在等待连接功能的完成,进程环从未出现 我已经尝试了各种不同的方法来解决这个问题,但是我对等待/任务/调度缺乏了解 以下是有关ProgressRing和Connect函数的代码: vm.IsConnecting = true; await Window.Current.Dispatcher.RunAsync(

在我的程序中,我有一个计时器,当它计时到0时,我希望我的应用程序“连接”到一个服务,当它“连接”时,让它显示一个进度环

似乎我的进度环在设置为活动状态的功能结束之前不会被“激活”。但由于我正在等待连接功能的完成,进程环从未出现

我已经尝试了各种不同的方法来解决这个问题,但是我对等待/任务/调度缺乏了解

以下是有关ProgressRing和Connect函数的代码:

vm.IsConnecting = true;

await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => vm.Connect());

if (vm.ConnectionClear)
    this.Frame.Navigate(typeof(MainPage), vm);

vm.IsConnecting = false;
vm.IsConnecting是ProgressRing的IsActive属性绑定到的对象

如何使它在vm.IsConnecting设置为true后立即显示progressRing

应该注意的是,我的目标是WinRT,因此我的工具箱有些有限

奇怪的是,我在EventHandler中有与上面相同的代码块,用于单击按钮,它的工作方式与我认为应该的一样。也就是说,单击按钮时,将显示ProgressRing,程序将执行连接方法,完成后,ProgressRing将消失

private async void Connect_Clicked(object sender, RoutedEventArgs e)
{
    vm.IsConnecting = true;

    await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => vm.Connect());

    if (vm.ConnectionClear)
        this.Frame.Navigate(typeof(MainPage), vm);

    vm.IsConnecting = false;
}

我相信您想要的是在VM上公开一个
async
方法,例如:

public async Task ConnectAsync();
然后您可以这样使用:

vm.IsConnecting = true;

await vm.ConnectAsync();

if (vm.ConnectionClear)
    this.Frame.Navigate(typeof(MainPage), vm);

vm.IsConnecting = false;

一般来说,任何使用
Dispatcher
的行为都表明您的设计需要改进。

您看过BackgroundWorker吗?我相信它是专门设计来允许后台进程使用UI线程并使用自己的方法报告其进度的。我不认为这个答案是正确的,所以我没有把它写出来作为答案,但可能是以后的好参考?看一看:我非常想使用BackgroundWorkers,因为我以前使用过它们,并且对它们的功能有更深入的了解。也就是说,WinRT工具集中不包含它们。我可以使用您的方法删除dispatcher代码段,但它仍然拒绝在我认为应该显示进度环时显示进度环。我对原始帖子进行了编辑,可能会,也可能不会对我的问题提供更多的见解。谢谢。您的
ConnectAsync
方法是否正确地异步?我不知道如何回答这个问题。Connect是public void Connect(),现在是public async Task ConnectAsync()。我假设还有更多需要更改的内容,但我不想在Connect方法中等待任何内容。无论您的“服务”是什么(HTTP/WCF/Whatever),请将其更改为使用异步方法,并从
ConnectAsync
中等待。如果您只是使
ConnectAsync
async
,而没有实际使用
wait
,那么它将无法正常工作;正如编译器错误声明的那样,它将同步运行,从而破坏微调器的功能。它可以工作!当进步之环最终出现在里氏震级上时,人们松了一口气。非常感谢!