在C#中,Task.Run当然是一个很好的启动新并行任务的机制,但是因为使用这个方法时,每次新的任务都会在一个新的线程中(其实就是线程池中的线程)运行

这样会造成某些情形下现场调度的相对困难,即使我隔离出一个与UI无关的对象,然后用UI线程的Dispatcher实现对UI线程的交互,但是用Task启动的多个任务线程却难以管理,而且.net Core UWP已经不再提供具体线程调度的管理了

最终我写了个这个玩意

    class NoUIDispatcher:IDisposable
{
#if DEBUG
~NoUIDispatcher()
{
System.Diagnostics.Debug.WriteLine(nameof(NoUIDispatcher) + " bedeleted");
}
#endif
public async void Start()
{
await Task.Run(() =>
{
try
{
normaltasklist = new List<Tuple<DispatchedHandler, OperationDeferral>>();
while (isdispose == false)
{
lock (normaltasklist)
{
if (normaltasklist.Count == 0)
{
od.Start();
}
else
{
normaltasklist[0].Item1.Invoke();
normaltasklist[0].Item2?.Complete();
normaltasklist.RemoveAt(0);
}
}
od.WaitOne();
}
normaltasklist = null;
System.Diagnostics.Debug.WriteLine(nameof(NoUIDispatcher) + " dispose");
}
catch
{
System.Diagnostics.Debug.WriteLine(nameof(NoUIDispatcher) + " error");
}
});
}
OperationDeferral od = new OperationDeferral();
List<Tuple<DispatchedHandler, OperationDeferral>> normaltasklist = null; public async Task RunAsync(DispatchedHandler agileCallback)
{
await Task.Run(() =>
{
try
{
var pk = new OperationDeferral();
pk.Start();
/*if (normaltasklist == null)
{
System.Diagnostics.Debug.WriteLine(nameof(NoUIDispatcher) + " isdisposed");
return;
}*/
lock (normaltasklist)
{
normaltasklist.Add(new Tuple<DispatchedHandler, OperationDeferral>(agileCallback, pk));
}
od.CompleteWithoutDispose();
pk.WaitOne();
}
#if DEBUG
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(nameof(NoUIDispatcher) + " " + e.ToString());
}
#else
catch { }
#endif
});
}
public void Run(DispatchedHandler agileCallback)
{
Task.Run(() =>
{
try
{
/*if (normaltasklist == null)
{
System.Diagnostics.Debug.WriteLine(nameof(NoUIDispatcher) + " isdisposed");
return;
}*/
lock (normaltasklist)
{
normaltasklist.Add(new Tuple<DispatchedHandler, OperationDeferral>(agileCallback, null));
}
od.CompleteWithoutDispose();
}
#if DEBUG
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(nameof(NoUIDispatcher) + " " + e.ToString());
}
#else
catch { }
#endif
}).IgnorCompletion();
}
bool isdispose = false;
public void Dispose()
{
isdispose = true;
od.Complete();
}
} public class OperationDeferral
{
System.Threading.AutoResetEvent are = new System.Threading.AutoResetEvent(false);
public void Complete()
{
CompleteWithoutDispose();
are.Dispose();
}
public void CompleteWithoutDispose()
{
are.Set();
}
public void Start()
{
are.Reset();
}
public Task WaitOneAsync()
{
return Task.Run(() =>
{
try
{
are.WaitOne();
}
catch { }
});
}
public void WaitOne()
{
are.WaitOne();
}
}

最新文章

  1. TextBox
  2. hdu 5748(求解最长上升子序列的两种O(nlogn)姿势)
  3. [自制简单操作系统] 2、鼠标及键盘中断处理事件[PIC\GDT\IDT\FIFO]
  4. js多线程?
  5. Android Studio中导入第三方库
  6. ZigBee协议基本介绍
  7. C#中的interface、virtual和abstract
  8. poj 1035 Spell checker(水题)
  9. win10 下 学习 xe10 误以为调试失效
  10. 标注-CRF条件随机场
  11. canvas实现俄罗斯方块
  12. Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization
  13. TCP报文格式
  14. npm 发布包(publish)
  15. class空格多类名
  16. [最新原创电子书]lazarus开发者入门及中级教程
  17. Android -- Serializable和Parcelable需要注意的
  18. java 下载网络图片
  19. java高级----&gt;Thread之ExecutorService的使用
  20. Circular reference 循环引用 第二联系人

热门文章

  1. 性能卓越的js模板引擎--artTemplate
  2. javaScript之BOM操作2
  3. 关于case语句中声明变量并初始化的注意事项
  4. PHP语法(三):控制结构(For循环/If/Switch/While)
  5. Select into 的特点
  6. NFS网络共享服务部署
  7. IT技术思维导图
  8. [jquery]if条件句
  9. css3 text-overflow和white-space,word-wrap,word-break进阶
  10. jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9)