代码:

  1. using log4net;
  2. using SunCreate.CombatPlatform.Security;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Windows.Threading;
  8.  
  9. namespace SunCreate.CombatPlatform.Client
  10. {
  11. /// <summary>
  12. /// 线程帮助类(处理单线程任务)
  13. /// </summary>
  14. public class ThreadHelper
  15. {
  16. private static ILog _log = log4net.LogManager.GetLogger(typeof(ThreadHelper));
  17.  
  18. /// <summary>
  19. /// 执行
  20. /// 例:ThreadHelper.Run(() => { }, (ex) => { });
  21. /// </summary>
  22. /// <param name="doWork">在线程中执行</param>
  23. /// <param name="errorAction">错误处理</param>
  24. public static System.Threading.Tasks.Task Run(Action doWork, Action<Exception> errorAction = null)
  25. {
  26. System.Threading.Tasks.Task task = System.Threading.Tasks.Task.Factory.StartNew(() =>
  27. {
  28. try
  29. {
  30. if (doWork != null) doWork();
  31. }
  32. catch (Exception ex)
  33. {
  34. _log.Error("ThreadHelper.Run 错误", ex);
  35.  
  36. if (!SP.Get<IOnlineService>().GetNetStatus())
  37. {
  38. SP.Get<IUIManager>().Dispatcher.BeginInvoke(new Action(() =>
  39. {
  40. TaskDialog.Show("连接数据库失败,请联系系统管理员,给您带来不便,敬请谅解");
  41. }));
  42. }
  43. else
  44. {
  45. SP.Get<IUIManager>().Dispatcher.BeginInvoke(new Action(() =>
  46. {
  47. new WaitingWindow("查询失败,请联系系统管理员,给您带来不便,敬请谅解").Show();
  48. }));
  49. }
  50.  
  51. if (errorAction != null) errorAction(ex);
  52. }
  53. });
  54. return task;
  55. }
  56.  
  57. /// <summary>
  58. /// 封装Dispatcher.BeginInvoke
  59. /// 例:ThreadHelper.BeginInvoke(this.Dispatcher, () => { }, (ex) => { });
  60. /// </summary>
  61. /// <param name="errorAction">错误处理</param>
  62. public static void BeginInvoke(Dispatcher dispatcher, Action action, Action<Exception> errorAction = null)
  63. {
  64. dispatcher.BeginInvoke(new Action(() =>
  65. {
  66. try
  67. {
  68. action();
  69. }
  70. catch (Exception ex)
  71. {
  72. _log.Error("ThreadHelper.BeginInvoke 错误", ex);
  73.  
  74. TaskDialog.Show("加载失败,请联系系统管理员,给您带来不便,敬请谅解");
  75.  
  76. if (errorAction != null) errorAction(ex);
  77. }
  78. }));
  79. }
  80. }
  81. }

单线程任务 Task.Factory.StartNew 封装的更多相关文章

  1. Task.Factory.StartNew和Task.Run

    在系统中单开线程进行操作,经常用到Task,发现Task主要有以下两种方法 Task.Factory.StartNew(() => { }); Task.Run(() => { }); 初 ...

  2. Task.Factory.StartNew的用法

    代码: private void button5_Click(object sender, EventArgs e) { ; Task.Factory.StartNew(() => { Mess ...

  3. Task.Run Vs Task.Factory.StartNew

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  4. Task.Run Vs Task.Factory.StartNew z

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  5. Task.Run与Task.Factory.StartNew的区别

    Task是可能有延迟的工作单元,目的是生成一个结果值,或产生想要的效果.任务和线程的区别是:任务代表需要执行的作业,而线程代表做这个作业的工作者. 在.Net 4中,Task.Factory.Star ...

  6. C# Task.Run 和 Task.Factory.StartNew 区别

    Task.Run 是在 dotnet framework 4.5 之后才可以使用,但是 Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制.可以认 ...

  7. Task.Run Vs Task.Factory.StartNew 【收藏】

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  8. c#4.0 Task.Factory.StartNew 用法

    var t1 = Task.Factory.StartNew<string>(() => { return “1111111”; }); //t1.Wait(); t1.Contin ...

  9. task.factory.startnew()

    1.委托: public delegate int Math(int param1,int param2);定义委托类型 Public int Add(int param1,int param2)// ...

随机推荐

  1. MYSQL错误:You can't specify target table for update in FROM clause

    这句话意思是:不能先select再更新(修改)同一个表. 可以再外嵌套多一层,这个问题只有mysql有,mssql和oracle都没有. # 出错delete from Person where Id ...

  2. TZOJ 4746 Xiangqi(模拟棋盘数组)

    描述 Xiangqi is one of the most popular two-player board games in China. The game represents a battle ...

  3. TZOJ 5280 搜索引擎(模拟字符串)

    描述 谷歌.百度等搜索引擎已经成为了互连网中不可或缺的一部分.在本题中,你的任务也是设计一个搜索论文的搜索引擎,当然,本题的要求比起实际的需求要少了许多. 本题的输入将首先给出一系列的论文,对于每篇论 ...

  4. Aactivity和Service之间的通信

    一.在activity中定义三个按钮 一个开启服务  一个关闭服务,还有一个是向服务发送广播 当创建出Serevice时先执行Service的onCreate()创建服务后只执行一次 以后每次点击开启 ...

  5. php Pthread 多线程 (一) 基本介绍

    我们可以通过安装Pthread扩展来让PHP支持多线程.   线程,有时称为轻量级进程,是程序执行的最小单元.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,它与同属 ...

  6. mysql非主键自增长

    mysql并非只有主键才能自增长,而是设为键的列就可以设置自增长.   如下: CREATE TABLE t1 ( id INT, col1 INT auto_increment NOT NULL ) ...

  7. CodeSmith生成SQL Server视图的实体类脚本/对应的生成模板

    C#生成sql视图的实体类 using System;using System.Text;using CodeSmith.Engine;using SchemaExplorer;using Syste ...

  8. 相机拍摄时最重要的三个参数——光圈、快门、ISO

    注:这篇文章我四年前发布在其他地方,现在移过来. 如果你对相机只有很少了解,那么看这篇文章再好不过啦,我结合很多资料,力图用最通俗易懂的方式进行讲解. 相机拍摄时最重要的3个参数就是——光圈.快门.I ...

  9. url传递数据

    一.post传递数据 $ci = curl_init($url); curl_setopt($ci, CURLOPT_HEADER, 0); curl_setopt($ci, CURLOPT_RETU ...

  10. Vue.js2 + Laravel5 采用 CORS 方式解决 AJAX 跨域的问题

    一.建立中间件 php artisan make:middleware CorsAjax 二.编写中间件 CorsAjax <?phpnamespace App\Http\Middleware; ...