[Silverlight] 关于线程调用的扩展方法
来源:互联网 发布:淘宝配送地址怎么设置 编辑:程序博客网 时间:2024/05/29 18:04
Silverlight 里需要考虑异步调用的问题,比较麻烦。所以写了两个简单的扩展方法。
一个方法是为了更新 UI 控件。可以自动在不同的调用环境下判断是否需要 Invoke, 从而安全的调用控件相关的方法。
另一个方法的目的是把任务放到 ThreadPool 里去等待后续的异步执行。
代码如下:
一个调用示例:
这样,可以在调用方有效的减少很多因为满足同步/异步不同调用方式的需要而写的代码。
一个方法是为了更新 UI 控件。可以自动在不同的调用环境下判断是否需要 Invoke, 从而安全的调用控件相关的方法。
另一个方法的目的是把任务放到 ThreadPool 里去等待后续的异步执行。
代码如下:
using System.Windows;
using System;
using System.Threading;
public static class ThreadCallExtensions
{
/// <summary>
/// 用于 UI 控件的更新,或其他情形。可自动判断当前线程是否为 UI 线程,
/// 而触发同步或异步调用。
/// </summary>
/// <param name="obj"></param>
/// <param name="action"></param>
public static void CallThreadSafely(this DependencyObject obj, Action action)
{
if (obj.CheckAccess())
{
action();
}
else
{
obj.Dispatcher.BeginInvoke(action);
}
}
/// <summary>
/// 异步调用
/// </summary>
/// <param name="obj"></param>
/// <param name="action"></param>
public static void CallInBackground(this DependencyObject obj, Action action)
{
ThreadPool.QueueUserWorkItem(
delegate {
action();
});
}
}
using System;
using System.Threading;
public static class ThreadCallExtensions
{
/// <summary>
/// 用于 UI 控件的更新,或其他情形。可自动判断当前线程是否为 UI 线程,
/// 而触发同步或异步调用。
/// </summary>
/// <param name="obj"></param>
/// <param name="action"></param>
public static void CallThreadSafely(this DependencyObject obj, Action action)
{
if (obj.CheckAccess())
{
action();
}
else
{
obj.Dispatcher.BeginInvoke(action);
}
}
/// <summary>
/// 异步调用
/// </summary>
/// <param name="obj"></param>
/// <param name="action"></param>
public static void CallInBackground(this DependencyObject obj, Action action)
{
ThreadPool.QueueUserWorkItem(
delegate {
action();
});
}
}
一个调用示例:
var db = CreateDataAccess();
// this 是当前的 Page
this.CallInBackground(
delegate {
var roles = db.FindAll<Role>("Role", null, null);
// listRoles 是一个 ListBox
listRoles.CallThreadSafely(
delegate {
listRoles.ItemsSource = roles;
});
});
// this 是当前的 Page
this.CallInBackground(
delegate {
var roles = db.FindAll<Role>("Role", null, null);
// listRoles 是一个 ListBox
listRoles.CallThreadSafely(
delegate {
listRoles.ItemsSource = roles;
});
});
这样,可以在调用方有效的减少很多因为满足同步/异步不同调用方式的需要而写的代码。
- [Silverlight] 关于线程调用的扩展方法
- [Silverlight] 关于线程调用的扩展方法
- [Silverlight] 写了两个方便 DOM 查找的扩展方法
- 关于List的扩展方法
- 关于方法的调用
- [Silverlight] 一个易犯的错误:关于调用 WCF 服务
- silverlight 组合键调用方法
- silverlight调用MVC WebApi方法
- Silverlight的组合键、快捷键(热键)调用方法
- 关于so库中的方法不能在子线程中调用的问题
- 关于使用扩展方法的警告
- 关于方法的调用情况
- Silverlight - 关于UI线程 / CompositionTarget.Rendering 事件
- 网上找到的关于c#线程池扩展
- 关于vs2005的线程安全性问题以及简化线程调用
- 关于C#扩展方法
- 关于LINQ扩展方法
- 关于扩展方法
- 用 Silverlight 开发围棋在线对弈程序(二)MVC
- 用 Silverlight 开发围棋在线对弈程序(一)UI 雏形
- Silverlight 的 Isolated Storage 学习笔记
- VS 2008 Server Explorer 添加数据库连接出错
- Easier programming asynchronous calls
- [Silverlight] 关于线程调用的扩展方法
- [转] Official Microsoft Team Blogs / Microsoft Blogs
- Silverlight 里如何实现隐式样式,ImplicitStyleManager 的实现思想
- IronPython 2.0 is finally released
- 用 Chiron 运行 IronPython 编写的 Silverlight 程序
- 谢谢马骐,谢谢 MVP Team
- 远程桌面超出连接数限制怎么办
- 我的 SciTE 配置文件
- ASP.NET Ajax 中 'Sys' 未定义脚本错误解决方法总结