扩展更灵活的TaskCompletionSource

         当需要把一些异步功能扩展支持async/await时一般都需要使用到TaskCompletionSource。但由于是强泛型类型所以在使用时有时的确不太方便的,为了更好地适配不同情况因此TaskCompletionSource的基础上扩展出更灵活的对应功能类。
         最近打算在MQTT协议的基础上扩展出远程接口调用功能,由于涉及到网络异操作,而DispatchProxy实现方法则是基本同步完成的,所以需在实现过程即用了TaskCompletionSource。

public class ClientDispatch : DispatchProxy
{


    protected override object Invoke(MethodInfo targetMethod, object[] args)
    {
        if (!mHandlers.TryGetValue(targetMethod.Name, out ActionHandler handler))
        {
            var error = new Exception($"{targetMethod.Name} action not found!");
            throw error;
        }
        else
        {
            if (!handler.IsTaskResult)
            {
                var error = new Exception("Definition is not supported, please define task with return value!");
                throw error;
            }
            var result = await NetInvoke;//网络处理
            return Convter(result)


        }
    }
}

以上伪代码看上去很正常,但这个虚方法是无法标记为async处理,所以以上await代码不能使用的;显然这里单个TaskCompletionSource是无法完成的,网络调用也有一个TaskCompletionSource过程,而这里则需要两个TaskCompletionSource串联起来;为了更好地处理这一过程派生出一个新的功能类。

interface IAnyCompletionSource
{
    void Success(object data);
    void Error(Exception error);
    void WaitResponse(Task<object> task);
    Task GetTask();
}
class AnyCompletionSource<T> : TaskCompletionSource<T>, IAnyCompletionSource
{
    public void Success(object data)
{
        TrySetResult((T)data);
    }
    public void Error(Exception error)
{
        TrySetException(error);
    }


    public async void WaitResponse(Task<object> task)
{
        try
        {
            var response = await task;
            if (response != null)
            {


                Success(response);
            }
            else
            {
                Success(new object());
            }


        }
        catch (Exception e_)
        {
            TrySetException(e_);
        }
    }
    public async void SetTimeOut(int timeout, string message)
{
        try
        {
            await System.Threading.Tasks.Task.Delay(timeout);
            if (!this.Task.IsCompleted)
                TrySetException(new TimeoutException(message));
        }
        catch { }
    }
    public Task GetTask()
{
        return this.Task;
    }


}

新的类提供了一个WaitResponse方法,可以让这个TaskCompletionSource的完成依赖于另一个Task的完成情况;有了这个扩展那对于接口远程调用的实现就会简单很多了。

protected override object Invoke(MethodInfo targetMethod, object[] args)
{
    if (!mHandlers.TryGetValue(targetMethod.Name, out ActionHandler handler))
    {
        var error = new MQTTException($"{targetMethod.Name} action not found!");
        throw error;
    }
    else
    {


        if (!handler.IsTaskResult)
        {
            var error = new MQTTException("Definition is not supported, please define task with return value!");
            throw error;
        }
        var request = new Publish();
        request.Topic = handler.Url;
        request.Payload = Client.DataFormater.EncodeParameters(args);
        var task = Client.SendWait(request);
        IAnyCompletionSource source = handler.GetCompletionSource();
        source.WaitResponse(task, Client, handler.ResponseType);
        return source.GetTask();


    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大数据平台的可扩展性和灵活性是确保平台能够适应不断增长的数据量和变化需求的关键因素。下面是一些关于可扩展性和灵活性的建议: 1. 分布式架构:采用分布式架构是实现可扩展性的关键。通过将数据分布在多个节点上进行并行处理,可以有效地处理大规模数据集。常见的分布式架构包括主从架构、集群架构和分布式文件系统等。 2. 水平扩展:水平扩展是增加平台处理能力的一种方式。通过增加多的计算节点或存储节点来分担负载,可以提高系统的吞吐量和处理能力。同时,水平扩展还可以提供好的容错性,因为系统中的单个节点故障不会影响整体性能。 3. 弹性伸缩:弹性伸缩是指根据实际需求动态调整平台的资源。通过自动监测系统负载和需求变化,可以自动增加或减少计算节点或存储容量,以适应不断变化的工作负载。这样可以提高资源利用率并降低成本。 4. 容器化技术:采用容器化技术(如Docker、Kubernetes)可以提高平台的灵活性。通过将应用程序和依赖项打包为容器,可以简化部署和扩展过程,并使应用程序可以在不同的环境中移植和运行。 5. 数据分区与分片:合理的数据分区和分片策略可以提高平台的可扩展性和性能。通过将数据划分为小的单元,并在集群中分布存储和处理,可以实现好的负载均衡和并行处理。 6. 开放式接口与标准:采用开放式接口和标准化的数据格式可以提高平台的灵活性。这样可以实现与其他系统的集成,并支持多种数据处理框架和工具。 7. 实时处理能力:随着实时数据的增加,对实时处理能力的需求也在增加。建议在平台中引入流处理引擎,以支持实时数据处理和分析。 总之,可扩展性和灵活性是大数据平台设计的重要考虑因素。通过合适的架构设计、弹性伸缩、容器化技术和数据分区等策略,可以构建一个具有高度可扩展性和灵活性的大数据平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值