본문 바로가기
C#(CSharp)/Etc

BlockingQueue (BlockingCollection)

by swconsulting 2017. 8. 7.

public static BlockingCollection<CheckMailBody> bc = new BlockingCollection<CheckMailBody>();


        public static void AddMailWorker(String body, Exception ex)

        {

            try

            {

                CheckMailBody checkMailBody = new CheckMailBody( body, ex );


                bc.Add( checkMailBody );

            } 

            catch(Exception e)

            {

                CommonLog.ErrorLog( "AddMailWorker", e );

            }


        }


        public static void StartMailWorker()

        {

            Task mailTask = Task.Factory.StartNew( async () =>

            {

                try

                {

                    // Consume consume the BlockingCollection

                    while ( !bc.IsAddingCompleted )

                    {

                        CheckMailBody checkMailBody = bc.Take();


                        if(checkMailBody.ex != null) 

                            CommonLog.InfoLog( "[StartMailWorker] checkMailBody body=" + checkMailBody.body + ", path=" + checkMailBody.ex.StackTrace, false );

                        else

                            CommonLog.InfoLog( "[StartMailWorker] checkMailBody body=" + checkMailBody.body, false );


                        await CommonUtil.SendMe( checkMailBody.body, checkMailBody.ex );

                    }

                }

                catch ( InvalidOperationException )

                {

                    // An InvalidOperationException means that Take() was called on a completed collection

                    Console.WriteLine( "That's All!" );

                }

            } );

        }


--------------------------------------------------------------------------------------------------------------------------------

CommonUtil.StartMailWorker();