Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# Silverlight中的多个异步UI更新_C#_Silverlight_Callback - Fatal编程技术网

C# Silverlight中的多个异步UI更新

C# Silverlight中的多个异步UI更新,c#,silverlight,callback,C#,Silverlight,Callback,如何从Silverlight回调执行多个UI更新 例如,我希望用户单击一个按钮,让UI进行更改,做一些工作,然后再进行另一个更改。。。相反,用户单击按钮,回调似乎在后台执行,然后所有UI更改都在我眼前闪烁 MainPage.xaml: <Grid x:Name="LayoutRoot" Background="White" > <TextBlock Height="23" Name="textBlock1" Text="TextBlock" VerticalAlignment=

如何从Silverlight回调执行多个UI更新

例如,我希望用户单击一个按钮,让UI进行更改,做一些工作,然后再进行另一个更改。。。相反,用户单击按钮,回调似乎在后台执行,然后所有UI更改都在我眼前闪烁

MainPage.xaml:

<Grid x:Name="LayoutRoot" Background="White" >
<TextBlock Height="23" Name="textBlock1" Text="TextBlock" VerticalAlignment="Top"/>
<Button Click="button1_Click" Content="Button" Height="23" Name="button1" Width="75"  />
</Grid>
异步运行,因此将返回并更改文本

直接来自MSDN文档:“BeginInvoke是异步的;因此,控件在被调用后立即返回到调用对象。”

而是在BeginInvoke中添加要执行的处理。所以你要做的是线程。睡眠,然后在文本框中添加更改

也可以与活动联系在一起。因此,当用户界面被更新时,即BackGroundWorker completed事件,您可以启动下一项。这就是为什么您应该使用

i、 e

异步运行,因此将返回并更改文本

直接来自MSDN文档:“BeginInvoke是异步的;因此,控件在被调用后立即返回到调用对象。”

而是在BeginInvoke中添加要执行的处理。所以你要做的是线程。睡眠,然后在文本框中添加更改

也可以与活动联系在一起。因此,当用户界面被更新时,即BackGroundWorker completed事件,您可以启动下一项。这就是为什么您应该使用

i、 e


Silverlight使用一个工作项队列来处理UI线程上的呈现和逻辑。由于您的逻辑也在UI线程上运行(在
按钮\u单击
处理程序中),因此在方法执行完毕且内部消息循环开始绘制屏幕之前,渲染器没有机会绘制屏幕

您的
BeginInvoke
会立即将您的函数放置在Silverlight工作队列中,以便在UI线程上执行(并立即返回)。Silverlight处理此问题的顺序可能类似于:

  • 用户单击按钮,在工作队列上放置一个单击事件
  • Silverlight看到click事件并调用
    按钮\u click
    (在工作队列上放置新操作)
  • 处理下一个工作队列项目,该项目可能是您的
    线程。睡眠
    操作,将UI线程暂停5秒钟
  • 最后Silverlight开始画屏幕
您要做的是启动一个新线程来完成工作,然后
BeginInvoke
返回UI线程:

var thread = new Thread(() => {
  Thread.Sleep(5000);
  Dispatcher.BeginInvoke(() => { 
    // update UI 
    textBox.Text = "2";
  });
});

textBox.Text = "1";
thread.Start();

我应该补充一点,Silverlight 5添加了一个合成线程,可以执行某些操作来更新UI,而不会阻塞UI线程,如播放动画和尽可能执行GPU加速渲染。

Silverlight使用一个工作项队列来处理UI线程上的渲染和逻辑。由于您的逻辑也在UI线程上运行(在
按钮\u单击
处理程序中),因此在方法执行完毕且内部消息循环开始绘制屏幕之前,渲染器没有机会绘制屏幕

您的
BeginInvoke
会立即将您的函数放置在Silverlight工作队列中,以便在UI线程上执行(并立即返回)。Silverlight处理此问题的顺序可能类似于:

  • 用户单击按钮,在工作队列上放置一个单击事件
  • Silverlight看到click事件并调用
    按钮\u click
    (在工作队列上放置新操作)
  • 处理下一个工作队列项目,该项目可能是您的
    线程。睡眠
    操作,将UI线程暂停5秒钟
  • 最后Silverlight开始画屏幕
您要做的是启动一个新线程来完成工作,然后
BeginInvoke
返回UI线程:

var thread = new Thread(() => {
  Thread.Sleep(5000);
  Dispatcher.BeginInvoke(() => { 
    // update UI 
    textBox.Text = "2";
  });
});

textBox.Text = "1";
thread.Start();

我应该补充一点,Silverlight 5添加了一个合成线程,该线程可以执行某些操作来更新UI,而不会阻塞UI线程,如播放动画和尽可能执行GPU加速渲染。

不必在工作完成时休眠线程,您可以在工作完成后触发事件。然后,该事件的侦听器将进行第二次UI更改。@iimpact睡眠调用只是在填充工作。问题是,为什么第一次UI更新不在睡眠调用之前进行?与其在工作完成期间睡眠线程,不如在工作完成后触发事件。然后,该事件的侦听器将进行第二次UI更改。@iimpact睡眠调用只是在填充工作。问题是,为什么第一次UI更新不在睡眠调用之前进行?看起来Silverlight Dispatcher不包含Invoke方法,因此Dispatcher只能异步使用。即使如此,我仍然不明白为什么第一个更改在任何情况下都不立即可见。@jordanpg是的,很抱歉,如果调用仍然存在,我将其编辑为更好的答案。看起来我已经得到了。。。更神秘的是,如果我尝试:private void button1\u Click(object sender,RoutedEventArgs e){textBlock1.Text=“1”Dispatcher.BeginInvoke(()=>{Thread.Sleep(5000);textBlock1.Text=“2”});textBlock1.Text=“3”}上一次UI更新甚至都没有发生!这是因为文本已更改为1。调用BeginInvoke并返回。它将文本设置为3。大约5秒后,文本变为2。屏幕更新速度不够快,因此无法看到。一种解决方案是使用事件或更改BeginInvokes。我认为您不完全理解这种异步风格的编程。问题是,即使删除了BeginInvoke调用,文本也不会变为1。因此,即使我这样做:{tb1.Text=“1”Thread.Sleep(1000);tb1.Text=“3”},我仍然只看到一个3。看起来Silverlight Dispatcher不包含调用方法,因此Dispatcher只能异步使用
var thread = new Thread(() => {
  Thread.Sleep(5000);
  Dispatcher.BeginInvoke(() => { 
    // update UI 
    textBox.Text = "2";
  });
});

textBox.Text = "1";
thread.Start();