30
30
//---------------------------------------------------------------------------
31
31
32
32
using System ;
33
+ using System . Collections . Generic ;
33
34
using System . Diagnostics ;
34
- using System . Threading ;
35
35
using System . Threading . Tasks ;
36
36
37
37
using RabbitMQ . Client ;
38
+ using RabbitMQ . Client . Exceptions ;
38
39
39
40
namespace CreateChannel
40
41
{
@@ -44,49 +45,89 @@ public static class Program
44
45
private const int ChannelsToOpen = 50 ;
45
46
46
47
private static int channelsOpened ;
47
- private static AutoResetEvent doneEvent ;
48
48
49
49
public static async Task Main ( )
50
50
{
51
- doneEvent = new AutoResetEvent ( false ) ;
51
+ var doneTcs = new TaskCompletionSource < bool > ( ) ;
52
52
53
53
var connectionFactory = new ConnectionFactory { } ;
54
54
await using IConnection connection = await connectionFactory . CreateConnectionAsync ( ) ;
55
55
56
56
var watch = Stopwatch . StartNew ( ) ;
57
- _ = Task . Run ( async ( ) =>
57
+ var workTask = Task . Run ( async ( ) =>
58
58
{
59
- var channels = new IChannel [ ChannelsToOpen ] ;
60
- for ( int i = 0 ; i < Repeats ; i ++ )
59
+ try
61
60
{
62
- for ( int j = 0 ; j < channels . Length ; j ++ )
61
+ var channelOpenTasks = new List < Task < IChannel > > ( ) ;
62
+ var channelDisposeTasks = new List < ValueTask > ( ) ;
63
+ var channels = new List < IChannel > ( ) ;
64
+ for ( int i = 0 ; i < Repeats ; i ++ )
63
65
{
64
- channels [ j ] = await connection . CreateChannelAsync ( ) ;
65
- channelsOpened ++ ;
66
- }
66
+ for ( int j = 0 ; j < ChannelsToOpen ; j ++ )
67
+ {
68
+ channelOpenTasks . Add ( connection . CreateChannelAsync ( ) ) ;
69
+ }
67
70
68
- for ( int j = 0 ; j < channels . Length ; j ++ )
69
- {
70
- await channels [ j ] . DisposeAsync ( ) ;
71
+ for ( int j = 0 ; j < channelOpenTasks . Count ; j ++ )
72
+ {
73
+ IChannel ch = await channelOpenTasks [ j ] ;
74
+ if ( j % 8 == 0 )
75
+ {
76
+ try
77
+ {
78
+ await ch . QueueDeclarePassiveAsync ( Guid . NewGuid ( ) . ToString ( ) ) ;
79
+ }
80
+ catch ( OperationInterruptedException )
81
+ {
82
+ await ch . DisposeAsync ( ) ;
83
+ }
84
+ catch ( Exception ex )
85
+ {
86
+ _ = Console . Error . WriteLineAsync ( $ "{ DateTime . Now : s} [ERROR] { ex } ") ;
87
+ }
88
+ }
89
+ else
90
+ {
91
+ channels . Add ( ch ) ;
92
+ channelsOpened ++ ;
93
+ }
94
+ }
95
+ channelOpenTasks . Clear ( ) ;
96
+
97
+ for ( int j = 0 ; j < channels . Count ; j ++ )
98
+ {
99
+ channelDisposeTasks . Add ( channels [ j ] . DisposeAsync ( ) ) ;
100
+ }
101
+
102
+ for ( int j = 0 ; j < channels . Count ; j ++ )
103
+ {
104
+ await channelDisposeTasks [ j ] ;
105
+ }
106
+ channelDisposeTasks . Clear ( ) ;
71
107
}
72
- }
73
108
74
- doneEvent . Set ( ) ;
109
+ doneTcs . SetResult ( true ) ;
110
+ }
111
+ catch ( Exception ex )
112
+ {
113
+ doneTcs . SetException ( ex ) ;
114
+ }
75
115
} ) ;
76
116
77
117
Console . WriteLine ( $ "{ Repeats } times opening { ChannelsToOpen } channels on a connection. => Total channel open/close: { Repeats * ChannelsToOpen } ") ;
78
118
Console . WriteLine ( ) ;
79
119
Console . WriteLine ( "Opened" ) ;
80
- while ( ! doneEvent . WaitOne ( 500 ) )
120
+ while ( false == doneTcs . Task . IsCompleted )
81
121
{
82
122
Console . WriteLine ( $ "{ channelsOpened , 5 } ") ;
123
+ await Task . Delay ( 150 ) ;
83
124
}
84
125
watch . Stop ( ) ;
85
126
Console . WriteLine ( $ "{ channelsOpened , 5 } ") ;
86
127
Console . WriteLine ( ) ;
87
- Console . WriteLine ( $ "Took { watch . Elapsed . TotalMilliseconds } ms ") ;
128
+ Console . WriteLine ( $ "Took { watch . Elapsed } ") ;
88
129
89
- Console . ReadLine ( ) ;
130
+ await workTask ;
90
131
}
91
132
}
92
133
}
0 commit comments