{"id":17008737,"url":"https://github.com/i-e-b/dispatchsharp","last_synced_at":"2025-04-19T18:11:18.053Z","repository":{"id":7650708,"uuid":"9011474","full_name":"i-e-b/DispatchSharp","owner":"i-e-b","description":"A library to make multi-threaded code more testable","archived":false,"fork":false,"pushed_at":"2023-06-12T08:55:54.000Z","size":3666,"stargazers_count":1,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-29T11:23:31.068Z","etag":null,"topics":["batch-processing","c-sharp","production-ready","test-driven-development","thread-pool","threading","working"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/i-e-b.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-03-25T17:09:24.000Z","updated_at":"2023-08-30T12:00:54.000Z","dependencies_parsed_at":"2024-11-28T22:40:57.666Z","dependency_job_id":"bce5995b-fb7b-4af7-a053-28ffcb4a4b0b","html_url":"https://github.com/i-e-b/DispatchSharp","commit_stats":{"total_commits":76,"total_committers":7,"mean_commits":"10.857142857142858","dds":0.25,"last_synced_commit":"da5776eb3b2a811db7e50c8737d21e7d3f235906"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-e-b%2FDispatchSharp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-e-b%2FDispatchSharp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-e-b%2FDispatchSharp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-e-b%2FDispatchSharp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/i-e-b","download_url":"https://codeload.github.com/i-e-b/DispatchSharp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249759981,"owners_count":21321821,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["batch-processing","c-sharp","production-ready","test-driven-development","thread-pool","threading","working"],"created_at":"2024-10-14T05:29:08.712Z","updated_at":"2025-04-19T18:11:18.036Z","avatar_url":"https://github.com/i-e-b.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"DispatchSharp\r\n=============\r\n\r\nhttps://www.nuget.org/packages/DispatchSharp/\r\n\r\nA library to make multi-threaded dispatch code more testable.\r\n\r\nModels a job dispatch pattern and provides both threaded and non threaded implementations.\r\n\r\nGetting Started\r\n---------------\r\n\r\nDoing a batch of work:\r\n```csharp\r\nvoid DoBatch(IEnumerable\u003cobject\u003e workToDo) {\r\n\tvar dispatcher = Dispatch\u003cobject\u003e.CreateDefaultMultiThreaded(\"MyTask\");\r\n\r\n\tdispatcher.AddConsumer(MyWorkMethod);\r\n\tdispatcher.Start();\r\n\tdispatcher.AddWork(workToDo);\r\n\tdispatcher.WaitForEmptyQueueAndStop();\t// only call this if you're not filling the queue from elsewhere\r\n}\r\n```\r\n\r\nor\r\n\r\n```csharp\r\nDispatch\u003cint\u003e.ProcessBatch(\"BatchRequests\", Enumerable.Range(0, times).ToArray(), i =\u003e {\r\n        . . .\r\n    },\r\n    threadCount,\r\n    ex =\u003e {\r\n        Console.WriteLine(\"Error: \" + ex.Message);\r\n    }\r\n);\r\n```\r\n\r\nHandling long running incoming jobs:\r\n\r\n```csharp\r\ndispatcher = Dispatch\u003cobject\u003e.CreateDefaultMultiThreaded(\"MyService\");\r\ndispatcher.AddConsumer(MyWorkMethod);\r\ndispatcher.Start();\r\n.\r\n.\r\n.\r\ndispatcher.AddWork(...);\r\n```\r\n\r\nUsing a polling method to handle incoming jobs in a long-running process:\r\n\r\n```csharp\r\nvar dispatcher = Dispatch\u003cobject\u003e.PollAndProcess(\"MyService\", myPollingSource);\r\ndispatcher.AddConsumer(MyWorkMethod);\r\ndispatcher.Start();\r\n```\r\n\r\nwith a method defined like\r\n\r\n```csharp\r\nvoid MyWorkMethod(object obj)\r\n{\r\n\t. . .\r\n}\r\n```\r\n\r\nMultiple consumers\r\n------------------\r\n\r\nA dispatcher can be given multiple consumers.\r\nIn this case, each consumer will get given each work item added.\r\n\r\nSo with\r\n\r\n```csharp\r\ndispatcher = Dispatch\u003cstring\u003e.CreateDefaultMultiThreaded(\"MyService\");\r\ndispatcher.AddConsumer(wi=\u003e Console.Write($\" Consumer 1, work item {wi};\"));\r\ndispatcher.AddConsumer(wi=\u003e Console.Write($\" Consumer 2, work item {wi};\"));\r\ndispatcher.AddConsumer(wi=\u003e Console.Write($\" Consumer 3, work item {wi};\"));\r\ndispatcher.Start();\r\n\r\ndispatcher.AddWork(\"1\");\r\nConsole.WriteLine();\r\ndispatcher.AddWork(\"2\");\r\nConsole.WriteLine();\r\ndispatcher.AddWork(\"3\");\r\nConsole.WriteLine();\r\n```\r\n\r\nWe should get output similar to\r\n\r\n```\r\n Consumer 1, work item 1; Consumer 2, work item 1; Consumer 3, work item 1;\r\n Consumer 1, work item 2; Consumer 2, work item 2; Consumer 3, work item 2;\r\n Consumer 1, work item 3; Consumer 2, work item 3; Consumer 3, work item 3;\r\n```\r\n\r\nParallelism Modes\r\n-----------------\r\n\r\nBy default, work items are processed in parallel, with each consumer being run\r\nin sequential order ('work parallel').\r\n\r\nIf you need to have each work item handled strictly in-order, but each consumer\r\ncan be run in parallel, use the 'task parallel' mode:\r\n\r\n```csharp\r\ndispatcher = Dispatch\u003cstring\u003e.CreateTaskParallelMultiThreaded(\"MyService\");\r\ndispatcher.AddConsumer(wi=\u003e Console.Write($\" Consumer 1, work item {wi};\"));\r\ndispatcher.AddConsumer(wi=\u003e Console.Write($\" Consumer 2, work item {wi};\"));\r\ndispatcher.AddConsumer(wi=\u003e Console.Write($\" Consumer 3, work item {wi};\"));\r\ndispatcher.Start();\r\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fi-e-b%2Fdispatchsharp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fi-e-b%2Fdispatchsharp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fi-e-b%2Fdispatchsharp/lists"}