C# 安全回调的异步处理的封装

本文介绍了一个用于处理UI线程回调的异步任务类,包括初始化UI线程、判断当前线程是否为UI线程、在UI线程中执行委托的异步和同步方法,以及在完成异步操作后回调UI线程的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在窗口 load 里调用 AsyncTask.InitUIContext(); 初始化同步上下文

 

SwitchToUI  可以在多线程里切换到UI线程执行委托代码

AsyncSend  以阻塞模式执行回调

AsyncPost  以非阻塞模式执行回调

 

 

AsyncTask.AsyncPost<String>(() =>
{
    //在新的线程里执行
    return 获取网站源码?();
}, (v) =>
{
    //回到UI线程执行
    TextBox1.Text = v;
});
using System;
using System.Threading;

namespace Wpf.Model
{
    /// <summary>
    /// 异步任务 UI线程回调相关
    /// </summary>
    public static class AsyncTask
    {
        /// <summary>
        /// 线程同步上下文
        /// </summary>
        public static SynchronizationContext Context { get; private set; }

        /// <summary>
        /// UI线程ID
        /// </summary>
        public static Int32 mainThreadId { get; private set; }

        /// <summary>
        /// 初始化UI线程(只能在UI线程里初始化)
        /// </summary>
        public static void InitUIContext()
        {
            mainThreadId = Thread.CurrentThread.ManagedThreadId;
            Context = SynchronizationContext.Current;
        }

        /// <summary>
        /// 获取当前操作线程是否处于UI线程内
        /// </summary>
        public static Boolean IsUIThread
        {
            get
            {
                return Thread.CurrentThread.ManagedThreadId == mainThreadId;
            }
        }

        /// <summary>
        /// 提交到UI线程执行委托(异步)
        /// </summary>
        /// <param name="callback"></param>
        public static void PostToUI(Action callback)
        {
            try
            {
                if (Context == null)
                {
                    throw new Exception("SynchronizationContext.Current was not initialized");
                }
                if (AsyncTask.IsUIThread)
                {
                    callback();
                }
                else
                {
                    Context.Post((s) =>
                    {
                        callback();
                    }, null);
                }
            }
            catch (Exception ex)
            {
                LogHelper.energy.Error("AsyncTask.SwitchToUI=>" + ex.Message, ex);
            }
        }

        /// <summary>
        /// 切换到UI线程执行委托(同步)
        /// </summary>
        /// <param name="callback"></param>
        public static void SwitchToUI(Action callback)
        {
            try
            {
                if (Context == null)
                {
                    throw new Exception("SynchronizationContext.Current was not initialized");
                }
                if (AsyncTask.IsUIThread)
                {
                    callback();
                }
                else
                {
                    Context.Send((s) =>
                    {
                        callback();
                    }, null);
                }
            }
            catch (Exception ex)
            {
                LogHelper.energy.Error("AsyncTask.SwitchToUI=>" + ex.Message, ex);
            }
        }

        /// <summary>
        /// 异步执行委托,在完成后Send回调UI线程
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="asyncfunc">异步执行</param>
        /// <param name="completecallback">执行完成后回到当前线程回调</param>
        public static void AsyncSend<T>(Func<T> asyncfunc,Action<T> completecallback)
        {
            if (Context == null)
            {
                //当前是在UI线程内
                if (AsyncTask.IsUIThread)
                {
                    var result = asyncfunc();
                    completecallback((T)result);
                    //尝试初始化
                    InitUIContext();
                }
                else
                {
                    throw new Exception("SynchronizationContext.Current was not initialized");
                }
            }
            ThreadPool.QueueUserWorkItem((e) =>
            {
                try
                {
                    var result = asyncfunc();
                   
                    Context.Send((s) =>
                    {
                        completecallback((T)s);
                    }, result);
                }
                catch (Exception ex)
                {
                    LogHelper.energy.Error("AsyncTask.Async=>" + ex.Message, ex);
                }
            });
        }

        /// <summary>
        /// 异步执行委托,在完成后Post回调UI线程
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="asyncfunc">要异步执行的代码</param>
        /// <param name="completecallback">完成后Post执行的代码</param>
        public static void AsyncPost<T>(Func<T> asyncfunc, Action<T> completecallback)
        {
            if (Context == null)
            {
                //当前是在UI线程内
                if (AsyncTask.IsUIThread)
                {
                    var result = asyncfunc();
                    completecallback((T)result);
                    //尝试初始化
                    InitUIContext();
                }
                else
                {
                    throw new Exception("SynchronizationContext.Current was not initialized");
                }
            }
            ThreadPool.QueueUserWorkItem((e) =>
            {
                try
                {
                    var result = asyncfunc();

                    Context.Post((s) =>
                    {
                        completecallback((T)s);
                    }, result);
                }
                catch (Exception ex)
                {
                    LogHelper.energy.Error("AsyncTask.Async=>" + ex.Message, ex);
                }
            });
        }

        /// <summary>
        /// 异步执行 不是太紧急的任务
        /// </summary>
        /// <param name="asyncfunc"></param>
        public static void AsyncPost(Action asyncfunc)
        {
            if (asyncfunc != null)
            {
                ThreadPool.QueueUserWorkItem((e) =>
                {
                    try
                    {
                        asyncfunc();
                    }
                    catch (Exception ex)
                    {
                        LogHelper.energy.Error("AsyncTask.AsyncPost=>" + ex.Message, ex);
                    }
                });
            }
        }


    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值