日期:2014-05-17  浏览次数:20923 次

分享一个UI多任务阻塞处理的源代码
问题在这里http://bbs.csdn.net/topics/390369970
既要阻塞UI线程等待非UI线程结束,又要在非UI线程中进行UI操作,简单的Wait肯定会造成死锁。
因为很多时候UI与非UI操作夹杂在一起,写程序很方便。
为了解决这个问题,所以我写了一个比较通用的基于fastCSharp处理类。
就是建立一个UI任务队列,UI线程Wait新任务,非UI线程Pulse唤醒UI线程。
using System;
using System.Threading;
using fastCSharp;
using fastCSharp.threading;

namespace showjim.console
{
    /// <summary>
    /// UI多任务阻塞处理
    /// </summary>
    public class uiWait
    {
        /// <summary>
        /// 任务信息
        /// </summary>
        private class taskInfo
        {
            /// <summary>
            /// 执行委托
            /// </summary>
            public action Action;
            /// <summary>
            /// 等待完成锁
            /// </summary>
            public object WaitLock;
            /// <summary>
            /// 任务是否已完成
            /// </summary>
            public bool isFinally;
            /// <summary>
            /// 等待任务完成
            /// </summary>
            public void Wait()
            {
                Monitor.Enter(WaitLock);
                try
                {
                    if (!isFinally) Monitor.Wait(WaitLock);
                }
                finally { Monitor.Exit(WaitLock); }
            }
            /// <summary>
            /// 执行任务
            /// </summary>