using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace zdarzenia { class PrimeFinder { public delegate void PrimeFoundHandler(MyAsyncCompletedEventArgs args); private delegate void PrimeEventHandler(AsyncOperation asyncCallback); public event PrimeFoundHandler primeFoundHandler; SendOrPostCallback onCompletedCallback; public PrimeFinder() { onCompletedCallback = new SendOrPostCallback(Completed); } void Completion(int n,AsyncOperation ao) { MyAsyncCompletedEventArgs e = new MyAsyncCompletedEventArgs(n, new Exception(), false, new { }); ao.PostOperationCompleted(onCompletedCallback, e); } private void Completed(object state) { if (primeFoundHandler != null) primeFoundHandler((MyAsyncCompletedEventArgs)state); Console.WriteLine("completed"); } public bool isPrimal(int n) { if (n < 2) return false; for (int i = 2; i < n; i++) if (n % i == 0) return false; return true; } public void Find(AsyncOperation ao) { int n = 10000000; while (true) { if (isPrimal(n)) primeFoundHandler.Invoke(new MyAsyncCompletedEventArgs(n, new Exception(),false, new { })); n++; } Completion(n, ao); } public void FindAsync(int taskID) { AsyncOperation asOp = AsyncOperationManager.CreateOperation(taskID); PrimeEventHandler primeEventHandler = new PrimeEventHandler(Find); primeEventHandler.BeginInvoke(asOp, null, null); } } } //////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace zdarzenia { class Program { private static void newPrime(MyAsyncCompletedEventArgs args) { Console.WriteLine(args.N + "is prime!"); } static void Main(string[] args) { PrimeFinder primeFinder = new PrimeFinder(); primeFinder.primeFoundHandler += newPrime; primeFinder.Find(); } } } ///////////// using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace zdarzenia { class MyAsyncCompletedEventArgs : AsyncCompletedEventArgs { public int N { get; set; } public MyAsyncCompletedEventArgs(int n, Exception e, bool cancelled, object state) : base(e,cancelled,state) { N = n; } } }