### Using Orleans SyncWorker Grain with StartWorkAndPollUntilResult (C#) Source: https://github.com/orleanscontrib/orleans.syncwork/blob/main/README.md This snippet shows how to create a request object, get a reference to the synchronous worker grain using the grain factory, and execute the work using the StartWorkAndPollUntilResult extension method provided by the Orleans.SyncWork package. This method handles starting the work and polling for the result. ```C# var request = new PasswordVerifierRequest() { Password = "my super neat password that's totally secure because it's super long", PasswordHash = "$2a$11$vBzJ4Ewx28C127AG5x3kT.QCCS8ai0l4JLX3VOX3MzHRkF4/A5twy" }; var passwordVerifyGrain = grainFactory.GetGrain(Guid.NewGuid()); var result = await passwordVerifyGrain.StartWorkAndPollUntilResult(request); ``` -------------------------------- ### BenchmarkDotNet Performance Comparison - C# Source: https://github.com/orleanscontrib/orleans.syncwork/blob/main/README.md Defines a BenchmarkDotNet class 'Benchy' to compare the performance of serial, multi-task, parallel task, and Orleans grain-based password verification methods. It initializes a password verifier service and a request object for use in the benchmarks. ```C# public class Benchy { const int TotalNumberPerBenchmark = 100; private readonly IPasswordVerifier _passwordVerifier = new Services.PasswordVerifier(); private readonly PasswordVerifierRequest _request = new PasswordVerifierRequest() { Password = PasswordConstants.Password, PasswordHash = PasswordConstants.PasswordHash }; [Benchmark] public void Serial() { for (var i = 0; i < TotalNumberPerBenchmark; i++) { _passwordVerifier.VerifyPassword(PasswordConstants.PasswordHash, PasswordConstants.Password); } } [Benchmark] public async Task MultipleTasks() { var tasks = new List(); for (var i = 0; i < TotalNumberPerBenchmark; i++) { tasks.Add(_passwordVerifier.VerifyPassword(PasswordConstants.PasswordHash, PasswordConstants.Password)); } await Task.WhenAll(tasks); } [Benchmark] public async Task MultipleParallelTasks() { var tasks = new List(); Parallel.For(0, TotalNumberPerBenchmark, i => { tasks.Add(_passwordVerifier.VerifyPassword(PasswordConstants.PasswordHash, PasswordConstants.Password)); }); await Task.WhenAll(tasks); } [Benchmark] public async Task OrleansTasks() { var siloHost = await BenchmarkingSIloHost.GetSiloHost(); var grainFactory = siloHost.Services.GetRequiredService(); var tasks = new List(); for (var i = 0; i < TotalNumberPerBenchmark; i++) { var grain = grainFactory.GetGrain(Guid.NewGuid()); tasks.Add(grain.StartWorkAndPollUntilResult(_request)); } await Task.WhenAll(tasks); } } ``` -------------------------------- ### Defining Orleans SyncWorker Grain Interface and Implementation (C#) Source: https://github.com/orleanscontrib/orleans.syncwork/blob/main/README.md This snippet defines the necessary components for a synchronous worker grain using Orleans.SyncWork. It includes the grain interface inheriting from ISyncWorker and IGrainWithGuidKey, the grain implementation inheriting from SyncWorker and the interface, and the request and result classes used for the work. ```C# public interface IPasswordVerifierGrain : ISyncWorker, IGrainWithGuidKey; public class PasswordVerifierGrain : SyncWorker, IPasswordVerifierGrain { private readonly IPasswordVerifier _passwordVerifier; public PasswordVerifier( ILogger logger, LimitedConcurrencyLevelTaskScheduler limitedConcurrencyLevelTaskScheduler, IPasswordVerifier passwordVerifier) : base(logger, limitedConcurrencyLevelTaskScheduler) { _passwordVerifier = passwordVerifier; } protected override async Task PerformWork( PasswordVerifierRequest request, GrainCancellationToken grainCancellationToken) { var verifyResult = await _passwordVerifier.VerifyPassword(request.PasswordHash, request.Password); return new PasswordVerifierResult() { IsValid = verifyResult }; } } public class PasswordVerifierRequest { public string Password { get; set; } public string PasswordHash { get; set; } } public class PasswordVerifierResult { public bool IsValid { get; set; } } ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.