【发布时间】:2016-05-10 23:25:29
【问题描述】:
我的代码如下所示:
namespace CloudKey
{
/// <summary>
/// Interaction logic for Page1.xaml
/// </summary>
public partial class Page1 : Page
{
public Page1()
{
InitializeComponent();
}
private async void button_Click(object sender, RoutedEventArgs e)
{
//Begin Loading animation
Loading.Visibility = Visibility.Visible;
//Run Task
await Task.Run(() => LoginCheck());
}
async void LoginCheck()
{
await Dispatcher.InvokeAsync(
() =>
{
InitialSessionState iss = InitialSessionState.CreateDefault();
StringBuilder ss = new StringBuilder();
ss.AppendLine("some code here")
using (Runspace runspace = RunspaceFactory.CreateRunspace(iss))
{
Collection<PSObject> results = null;
try
{
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(ss.ToString());
results = pipeline.Invoke();
}
catch (Exception ex)
{
results.Add(new PSObject((object)ex.Message));
}
finally
{
runspace.Close();
Loading.Visibility = Visibility.Hidden;
if //some stuff
{
//do some things
}
else
{
//do some other things
}
}
}
});
}
}
}
我也试过
Async void LoginCheck()
{
await Dispatcher.Invoke (() => {//Stuff});
}
结果相同。我实际上不确定两者之间的区别是什么......
无论哪种方式,任务都会正确运行,但动画会在任务开始后立即冻结。 :/ 我应该怎么做才能使这项工作按照我想要的方式工作,加载动画在整个函数中设置动画?
编辑:
我应该补充一点,我试图删除
await Dispatcher.InvokeAsync(
() =>{});
并保留函数的其余部分,但是,当我这样做时,我收到以下错误:
The calling thread cannot access this object because a different thread owns it.
【问题讨论】:
-
你告诉一个新的线程池线程除了告诉 UI 线程执行一堆代码之外什么都不做。因此,所有代码都在 UI 线程中运行是意料之中的。如果要在 UI 线程之外运行代码,则需要在 UI 线程之外实际运行代码。
-
我不确定我是否理解...你能举个例子吗?
-
你提供了一个例子。您在 UI 线程中运行所有代码并抱怨您的所有代码都在 UI 线程中运行。
标签: c# wpf visual-studio asynchronous dispatcher