tpl demo

using System ;
using System.Collections.Concurrent ;
using System.Threading ;
using System.Threading.Tasks ;
using System.Threading.Tasks.Dataflow ;
 
namespace TDFDemo
{
class Program
{
static void Main ( string [] args )
{
new Program (). Run ();
}
 
private async void Run ()
{
var bus = new Bus ();
 
// Inline handler
var s1 = bus . Subscribe < Message >( message => Console . WriteLine ( "Inline Handler 1: {0}" , message . Content ));
 
// Inline handler factory
var s2 = bus . Subscribe < Message >(() => new MessageHandler (). Handle );
 
// Automatic handler subscription
var s3 = bus . Subscribe < Message , MessageHandler >();
 
for ( int i = 0 ; i < 10 ; i ++)
{
await bus . SendAsync ( new Message ( "Message " + i ));
}
 
// Unsubscribe the second handler
bus . Unsubscribe ( s2 );
 
Thread . Sleep ( 1000 );
 
// Cancellation support
 
Console . WriteLine ( "\nSecond Burst:" );
var tokenSource = new CancellationTokenSource ();
var token = tokenSource . Token ;
 
for ( int i = 0 ; i < 10 ; i ++)
{
await bus . SendAsync ( new Message ( "Message " + i ), token );
 
if ( i == 5 )
{
tokenSource . Cancel ();
break ;
}
}
 
Console . ReadLine ();
}
}
 
public class Message
{
public DateTime TimeStamp { get ; private set ; }
public string Content { get ; private set ; }
 
public Message ( string content )
{
Content = content ;
TimeStamp = DateTime . UtcNow ;
}
}
 
public interface IHandle < TMessage >
{
void Handle ( TMessage message );
}
 
public class MessageHandler : IHandle < Message >
{
public void Handle ( Message message )
{
Console . WriteLine ( "Message Handler Received: {0}" , message . Content );
}
}
 
public class Bus
{
private readonly BroadcastBlock < object > broadcast =
new BroadcastBlock < object >( message => message );
 
private readonly ConcurrentDictionary < Guid , IDisposable > subscriptions
= new ConcurrentDictionary < Guid , IDisposable >();
 
public Task < bool > SendAsync < TMessage >( TMessage message , CancellationToken cancellationToken )
{
return broadcast . SendAsync ( message , cancellationToken );
}
 
public Guid Subscribe < TMessage >( Action < TMessage > handlerAction )
{
var handler = new ActionBlock < object >(
message => handlerAction (( TMessage ) message ),
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 }
);
 
var subscription = broadcast . LinkTo (
handler ,
new DataflowLinkOptions { PropagateCompletion = true },
message => message is TMessage
);
 
return AddSubscription ( subscription );
}
 
public void Unsubscribe ( Guid subscriptionId )
{
IDisposable subscription ;
if ( subscriptions . TryRemove ( subscriptionId , out subscription ))
{
subscription . Dispose ();
}
}
 
private Guid AddSubscription ( IDisposable subscription )
{
var subscriptionId = Guid . NewGuid ();
subscriptions . TryAdd ( subscriptionId , subscription );
return subscriptionId ;
}
}
 
public static class BusExtensions
{
public static Task < bool > SendAsync < TMessage >( this Bus bus , TMessage message )
{
return bus . SendAsync < TMessage >( message , CancellationToken . None );
}
 
public static Guid Subscribe < TMessage >( this Bus bus , Func < Action < TMessage >> handlerActionFactory )
{
return bus . Subscribe < TMessage >( message => handlerActionFactory (). Invoke ( message ));
}
 
public static Guid Subscribe < TMessage , THandler >( this Bus bus ) where THandler : IHandle < TMessage >, new ()
{
return bus . Subscribe < TMessage >( message => new THandler (). Handle ( message ));
}
}
}

转载于:https://www.cnblogs.com/zeroone/p/3615133.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值