本文共 2345 字,大约阅读时间需要 7 分钟。
多个task调度的实例,需要加锁lock
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleAppTest{ class Program { static void Main(string[] args) { var account = new Account(1000); var tasks = new Task[100]; for (int i = 0; i < tasks.Length; i++) { tasks[i] = Task.Run(() => Update(account)); } Task t = Task.WhenAll(tasks); try { t.Wait(); } catch { } if (t.Status == TaskStatus.RanToCompletion) Console.WriteLine("All ping attempts succeeded."); else if (t.Status == TaskStatus.Faulted) Console.WriteLine("ping attempts failed"); Console.WriteLine($"Account's balance is {account.GetBalance()}"); Console.ReadKey(); } static void Update(Account account) { decimal[] amounts = { 0, 2, -3, 6, -2, -1, 8, -5, 11, -6 }; foreach (var amount in amounts) { if (amount >= 0) { account.Credit(amount); } else { account.Debit(Math.Abs(amount)); } } } } }public class Account{ private readonly object balanceLock = new object(); private decimal balance; public Account(decimal initialBalance) => balance = initialBalance; public decimal Debit(decimal amount) { if (amount < 0) { throw new ArgumentOutOfRangeException(nameof(amount), "The debit amount cannot be negative."); } decimal appliedAmount = 0; lock (balanceLock) { if (balance >= amount) { balance -= amount; appliedAmount = amount; } } return appliedAmount; } public void Credit(decimal amount) { if (amount < 0) { throw new ArgumentOutOfRangeException(nameof(amount), "The credit amount cannot be negative."); } lock (balanceLock) { balance += amount; } } public decimal GetBalance() { lock (balanceLock) { return balance; } }}
参考:
转载地址:http://okiii.baihongyu.com/