您好,欢迎来到时间财富网
全部需求分类
当前位置:首页 > 移动应用 > .NET Framework 精简版后台处理技术
.NET Framework 精简版后台处理技术
2015-08-14 03:34:26   作者:心缘新   人气:1297次  评论(0)
所属标签: 移动应用开发 
  显式创建的线程

  有些情况下,后台进程(例如连续读取全球定位系统或监视设备)会占用应用程序的大部分运行时间。在这些情况下,最好为特定的任务创建专用的线程。




  专用线程通过 Thread 类的实例实现,并通过将方法包装到 ThreadStart 委托,将此委托传递给 Thread 类构造函数,然后调用 Thread.Start 方法来创建。

void ReadGPSFeed() 
{
// 循环读取 GPS 数据
}

public void btnStartGPS_Click(object sender, EventArgs e)
{
ThreadStart startMethod = new ThreadStart(ReadGPSFeed);
Thread gpsThread = new Thread(startMethod);
gpsThread.Start(); // 启动后台线程
}

  在本例中,ReadGPSFeed 方法运行在一个新创建的线程上。此线程专用于 ReadGPSFeed 方法,并在该方法退出后终止。 

  通过专用线程完成的工作通常是以某种循环的方式执行处理。尽管在有些情况下由后台进程本身确定处理是否完成,但更多的情况下是由某个外部事件(如用户请求或应用程序关闭)来确定。以信号方式通知后台线程终止的最简单方式是通过类级别的布尔标志,如以下代码所示:

Class MyForm : Form
{
// 为清楚起见,省略了部分类成员
private bool _continueGPSRead = false; // 读取控制标志
void ReadGPSFeed() 
{
while (_continueGPSRead) // 循环,直到为 false
{
// 读取 GPS 数据
}
}
public void btnStartGPS_Click(object sender, EventArgs e)
{
ThreadStart startMethod = new ThreadStart(ReadGPSFeed);
Thread gpsThread = new Thread(startMethod);
_continueGPSRead = true; // 设置循环标志
gpsThread.Start(); // 启动后台线程
}
public void btnStopGPS_Click(object sender, EventArgs e)

_continueGPSRead = false ; // 发送 ReadGPSFeed 信号以终止
}
}

  在本例中,btnStartGPS_Click 通过将标志设置为“true”并启动相关线程,以启动后台处理。ReadGPSFeed 方法继续处理,直到通过 btnStopGPS_Click 将 _continueGPSRead 标志设置为“false”为止。 

  后台处理和用户体验

  后台处理是一个功能强大的工具,正确使用可以显著改善用户体验。但是,如果使用不当,也容易产生混乱甚至引起错误。要获得良好的用户体验,应记住以下几个要点。 不要直接影响用户界面一个应用程序最初只启动一个线程。正常情况下,所有用户界面控件均由该线程创建。


  Windows CE 用户界面对象具有“线程关系”,这意味着这些界面对象与创建它们的线程紧密耦合在一起。这种紧密耦合是由于所有与 Windows CE 用户界面对象的交互(读取和更新)均依赖于创建线程所管理的消息队列。与创建线程相比,与线程中的界面对象的消息队列进行交互容易引起数据损坏或其他误。.net Framework 精简版中的 Windows 窗体控件是 Windows CE 用户界面对象上的简便包装,它也具有同样的限制。此限制同时适用于线程池和显式创建的线程。


  要允许后台进程与用户界面进行安全的交互,所有 Windows 窗体控件都提供了一个特殊的 Invoke 方法。调用 Invoke 方法可以将控件传递给创建 Windows 窗体控件的线程,并在此线程上执行一个委托。用户界面线程中运行的方法必须包装在一个事件处理程序委托中。

class MyForm : Form
{
// 为清楚起见,省略了一些成员
private MathProxy _wsMath = new MathProxy();
protected TextBox _txtSum; // 将显示 XML Web Service 的结果
protected int _sum ;
public void btnAdd_OnClick(object sender, EventArgs e)
{
AsyncCallback cb = new AsyncCallback(OnAddComplete);
_wsMath.BeginAdd(10, 15, cb, null); // 启动 XML Web Service 调用
}
public OnAddComplete(IAsyncResult ar) // 完成后由框架调用
{
_sum = _wsMath.EndAdd(ar); // 获取 XML Web Service 结果
// 在创建 _txtSum 的线程上执行 UpdateSumDisplay
_txtSum.Invoke(new EventHandler(UpdateSumDisplay));
}
public void UpdateSumDisplay(object sender, EventArgs e)
{
_txtSum.Text = _sum.ToString();
}

  在本例中,btnAdd_OnClick 进行异步 Web 服务调用。异步调用完成后,将自动调用 OnAddComplete 方法。正如“异步 Web 服务”一节所述,OnAddComplete 方法在后台线程中运行,因此无法直接、安全地影响 _txtSum 文本框。使用 Invoke 方法,可以将控件传递给创建 _txtSum 的线程。然后,在此线程中运行 UpdateSumDisplay。

  注意:Invoke 是一个中断调用。Invoke 线程将中断,直到从被调用的方法返回。

  限制后台任务的并发数量

  执行的每个线程都会消耗有用的设备资源,并增加应用程序的复杂性。启动大量并发后台任务可能导致应用程序速度缓慢或响应迟钝。仅当任务在前台运行时会导致长时间或令人不舒服的延迟时,才应该在后台运行该任务。 

  提供可视提示

  后台任务运行在线程上,而不是运行在用户界面上,因此不提供后台处理状态的自动确认。应用程序必须采取特定的步骤来通知用户。大多数情况下,最好在用户的窗体中显示一个状态字段。这有助于用户了解后台进程的运行状态。 

  指示启动

  大多数情况下,后台处理是在响应用户操作(例如单击按钮操作)时启动的。在这种情况下,应在处理完成之前禁用启动后台进程的控件。禁用控件既可以确认后台进程已启动,又可以防止用户不小心启动任务的其他实例。还要禁用并清除后台任务完成后要更新的任何控件。 

  指示完成

  完成后,应用程序应在不干涉用户执行其他操作的前提下提供清楚的指示。处理结果应便于使用,并应启用任务开始时禁用的控件。如果遇到长时间运行的计算(后台处理产生几个简单的值),应将结果直接显示在启动该处理的窗体中。如果结果过于复杂,很难在一个窗体中显示,则最好启用一个按钮,使用户能够在单独的窗体中查看结果。即使后台任务(如大型数据上载)没有可视结果,用户也应接收到后台任务已完成的确认信息。在这种情况下,Pocket PC 用户通知 API (SHNotificationAdd) 尤其有用,因为它可以提供便于查看又不会带来干扰的确认信息。

  小结

  .net Framework 精简版丰富的异步 Web 服务和线程支持通过将长时间运行的进程移到后台,使开发日趋复杂的智能设备应用程序成为可能。决定在应用程序中引入后台处理时需要仔细规划,并理解可用的选项及其含义。如果使用得当,后台处理可以提高应用程序的响应性能,提供出色的用户体验,允许用户在不影响进程运行的情况下获得长时间运行的进程的结果。


  时间财富网为广大企业、商家、个人,提供平面设计、装修设计、建筑设计、起名改名、策划文案、网站建设、营销推广等服务。只要能通过网络解决的任务,都可以通过时间财富网来完成。若您有类似需要,请点击立即发布项目

  另,时间财富网上也有着各式各样的任务,无论您是拥有技能的专业人士,还是只剩时间的技术小白。都能在时间财富网上找到您能参与的项目。点击查看项目进入悬赏大厅