System.Threading.Tasks.Parallel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Threading; namespace ParallelExample { public partial class MainForm : Form { private object threadLock = new object(); public MainForm() { InitializeComponent(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { } private void btnProcessImages_Click(object sender, EventArgs e) { ProcessFiles(); // in main thread ProcessFilesParallel(); // in main thread ProcessFilesWithTask(); // << start in additional thread } private void ProcessFiles() // in main thread { string[] files = Directory.GetFiles(@"C:\Users\YellowFriend\Desktop\Pics\Digital-Flame\01", "*.jpg", SearchOption.AllDirectories); string newDir = @"C:\Users\YellowFriend\Desktop\Pics\Digital-Flame\01\ModifiedPictures"; Directory.CreateDirectory(newDir); foreach (string currentFile in files) { string filename = Path.GetFileName(currentFile); using (Bitmap bitmap = new Bitmap(currentFile)) { bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); bitmap.Save(Path.Combine(newDir, filename)); this.Text = string.Format("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId); } } this.Text = "All done"; } private void ProcessFilesParallel() // in main thread { CheckForIllegalCrossThreadCalls = false; string[] files = Directory.GetFiles(@"C:\Users\YellowFriend\Desktop\Pics\Digital-Flame\01", "*.jpg", SearchOption.AllDirectories); string newDir = @"C:\Users\YellowFriend\Desktop\Pics\Digital-Flame\01\ModifiedPictures"; Directory.CreateDirectory(newDir); Parallel.ForEach(files, currentFile => { string filename = Path.GetFileName(currentFile); using (Bitmap bitmap = new Bitmap(currentFile)) { bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); bitmap.Save(Path.Combine(newDir, filename)); //this.Text = string.Format("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId); } } ); } private async void ProcessFilesWithTask() { await Task.Factory.StartNew (()=> { CheckForIllegalCrossThreadCalls = false; ProcessFiles(); } ); } } } |