Browse Source

优化异步函数

懒得勤快 8 months ago
parent
commit
cbf379e687

+ 33 - 32
Masuit.Tools.Abstractions/Extensions/BaseType/IDictionaryExtensions.cs

@@ -3,6 +3,7 @@ using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace Masuit.Tools;
@@ -329,9 +330,9 @@ public static class IDictionaryExtensions
     /// <param name="this"></param>
     /// <param name="that">另一个字典集</param>
     /// <param name="updateValueFactory">更新时的操作</param>
-    public static Task AddOrUpdateAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
+    public static Task AddOrUpdateAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory, CancellationToken cancellationToken = default)
     {
-        return that.ForeachAsync(item => AddOrUpdateAsync(@this, item.Key, item.Value, updateValueFactory));
+        return that.ForeachAsync(item => AddOrUpdateAsync(@this, item.Key, item.Value, updateValueFactory), cancellationToken: cancellationToken);
     }
 
     /// <summary>
@@ -342,9 +343,9 @@ public static class IDictionaryExtensions
     /// <param name="this"></param>
     /// <param name="that">另一个字典集</param>
     /// <param name="updateValueFactory">更新时的操作</param>
-    public static Task AddOrUpdateAsync<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
+    public static Task AddOrUpdateAsync<TKey, TValue>(this NullableDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory, CancellationToken cancellationToken = default)
     {
-        return that.ForeachAsync(item => AddOrUpdateAsync(@this, item.Key, item.Value, updateValueFactory));
+        return that.ForeachAsync(item => AddOrUpdateAsync(@this, item.Key, item.Value, updateValueFactory), cancellationToken: cancellationToken);
     }
 
     /// <summary>
@@ -355,9 +356,9 @@ public static class IDictionaryExtensions
     /// <param name="this"></param>
     /// <param name="that">另一个字典集</param>
     /// <param name="updateValueFactory">更新时的操作</param>
-    public static Task AddOrUpdateAsync<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
+    public static Task AddOrUpdateAsync<TKey, TValue>(this NullableConcurrentDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory, CancellationToken cancellationToken = default)
     {
-        return that.ForeachAsync(item => AddOrUpdateAsync(@this, item.Key, item.Value, updateValueFactory));
+        return that.ForeachAsync(item => AddOrUpdateAsync(@this, item.Key, item.Value, updateValueFactory), cancellationToken: cancellationToken);
     }
 
     /// <summary>
@@ -512,9 +513,9 @@ public static class IDictionaryExtensions
     /// <param name="this"></param>
     /// <param name="that">另一个字典集</param>
     /// <param name="updateValueFactory">更新时的操作</param>
-    public static Task AddOrUpdateToAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
+    public static Task AddOrUpdateToAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, IDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory, CancellationToken cancellationToken = default)
     {
-        return @this.ForeachAsync(item => AddOrUpdateAsync(that, item.Key, item.Value, updateValueFactory));
+        return @this.ForeachAsync(item => AddOrUpdateAsync(that, item.Key, item.Value, updateValueFactory), cancellationToken: cancellationToken);
     }
 
     /// <summary>
@@ -525,9 +526,9 @@ public static class IDictionaryExtensions
     /// <param name="this"></param>
     /// <param name="that">另一个字典集</param>
     /// <param name="updateValueFactory">更新时的操作</param>
-    public static Task AddOrUpdateToAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, NullableDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
+    public static Task AddOrUpdateToAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, NullableDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory, CancellationToken cancellationToken = default)
     {
-        return @this.ForeachAsync(item => AddOrUpdateAsync(that, item.Key, item.Value, updateValueFactory));
+        return @this.ForeachAsync(item => AddOrUpdateAsync(that, item.Key, item.Value, updateValueFactory), cancellationToken: cancellationToken);
     }
 
     /// <summary>
@@ -538,9 +539,9 @@ public static class IDictionaryExtensions
     /// <param name="this"></param>
     /// <param name="that">另一个字典集</param>
     /// <param name="updateValueFactory">更新时的操作</param>
-    public static Task AddOrUpdateToAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, NullableConcurrentDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory)
+    public static Task AddOrUpdateToAsync<TKey, TValue>(this IDictionary<TKey, TValue> @this, NullableConcurrentDictionary<TKey, TValue> that, Func<TKey, TValue, Task<TValue>> updateValueFactory, CancellationToken cancellationToken = default)
     {
-        return @this.ForeachAsync(item => AddOrUpdateAsync(that, item.Key, item.Value, updateValueFactory));
+        return @this.ForeachAsync(item => AddOrUpdateAsync(that, item.Key, item.Value, updateValueFactory), cancellationToken: cancellationToken);
     }
 
     /// <summary>
@@ -620,9 +621,9 @@ public static class IDictionaryExtensions
     /// </summary>
     /// <param name="dic"></param>
     /// <param name="action">回调方法</param>
-    public static Task ForEachAsync<TKey, TValue>(this IDictionary<TKey, TValue> dic, Func<TKey, TValue, Task> action)
+    public static Task ForEachAsync<TKey, TValue>(this IDictionary<TKey, TValue> dic, Func<TKey, TValue, Task> action, CancellationToken cancellationToken = default)
     {
-        return dic.ForeachAsync(x => action(x.Key, x.Value));
+        return dic.ForeachAsync(x => action(x.Key, x.Value), cancellationToken: cancellationToken);
     }
 
     /// <summary>
@@ -722,11 +723,11 @@ public static class IDictionaryExtensions
     /// <param name="source"></param>
     /// <param name="keySelector">键选择器</param>
     /// <param name="elementSelector">值选择器</param>
-    public static async Task<NullableDictionary<TKey, TElement>> ToDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector)
+    public static async Task<NullableDictionary<TKey, TElement>> ToDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, CancellationToken cancellationToken = default)
     {
         var items = source as IList<TSource> ?? source.ToList();
         var dic = new NullableDictionary<TKey, TElement>(items.Count);
-        await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+        await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item), cancellationToken: cancellationToken);
         return dic;
     }
 
@@ -740,14 +741,14 @@ public static class IDictionaryExtensions
     /// <param name="keySelector">键选择器</param>
     /// <param name="elementSelector">值选择器</param>
     /// <param name="defaultValue">键未找到时的默认值</param>
-    public static async Task<NullableDictionary<TKey, TElement>> ToDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue)
+    public static async Task<NullableDictionary<TKey, TElement>> ToDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue, CancellationToken cancellationToken = default)
     {
         var items = source as IList<TSource> ?? source.ToList();
         var dic = new NullableDictionary<TKey, TElement>(items.Count)
         {
             FallbackValue = defaultValue
         };
-        await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+        await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item), cancellationToken: cancellationToken);
         return dic;
     }
 
@@ -848,11 +849,11 @@ public static class IDictionaryExtensions
     /// <param name="source"></param>
     /// <param name="keySelector">键选择器</param>
     /// <param name="elementSelector">值选择器</param>
-    public static async Task<DisposableDictionary<TKey, TElement>> ToDisposableDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector) where TElement : IDisposable
+    public static async Task<DisposableDictionary<TKey, TElement>> ToDisposableDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, CancellationToken cancellationToken = default) where TElement : IDisposable
     {
         var items = source as IList<TSource> ?? source.ToList();
         var dic = new DisposableDictionary<TKey, TElement>(items.Count);
-        await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+        await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item), cancellationToken: cancellationToken);
         return dic;
     }
 
@@ -866,14 +867,14 @@ public static class IDictionaryExtensions
     /// <param name="keySelector">键选择器</param>
     /// <param name="elementSelector">值选择器</param>
     /// <param name="defaultValue">键未找到时的默认值</param>
-    public static async Task<DisposableDictionary<TKey, TElement>> ToDisposableDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue) where TElement : IDisposable
+    public static async Task<DisposableDictionary<TKey, TElement>> ToDisposableDictionarySafetyAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue, CancellationToken cancellationToken = default) where TElement : IDisposable
     {
         var items = source as IList<TSource> ?? source.ToList();
         var dic = new DisposableDictionary<TKey, TElement>(items.Count)
         {
             FallbackValue = defaultValue
         };
-        await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+        await items.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item), cancellationToken: cancellationToken);
         return dic;
     }
 
@@ -970,10 +971,10 @@ public static class IDictionaryExtensions
     /// <param name="source"></param>
     /// <param name="keySelector">键选择器</param>
     /// <param name="elementSelector">值选择器</param>
-    public static async Task<NullableConcurrentDictionary<TKey, TElement>> ToConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector)
+    public static async Task<NullableConcurrentDictionary<TKey, TElement>> ToConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, CancellationToken cancellationToken = default)
     {
         var dic = new ConcurrentDictionary<TKey, TElement>();
-        await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+        await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item), cancellationToken: cancellationToken);
         return dic;
     }
 
@@ -987,13 +988,13 @@ public static class IDictionaryExtensions
     /// <param name="keySelector">键选择器</param>
     /// <param name="elementSelector">值选择器</param>
     /// <param name="defaultValue">键未找到时的默认值</param>
-    public static async Task<NullableConcurrentDictionary<TKey, TElement>> ToConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue)
+    public static async Task<NullableConcurrentDictionary<TKey, TElement>> ToConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue, CancellationToken cancellationToken = default)
     {
         var dic = new NullableConcurrentDictionary<TKey, TElement>
         {
             FallbackValue = defaultValue
         };
-        await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+        await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item), cancellationToken: cancellationToken);
         return dic;
     }
 
@@ -1079,10 +1080,10 @@ public static class IDictionaryExtensions
     /// <param name="source"></param>
     /// <param name="keySelector">键选择器</param>
     /// <param name="elementSelector">值选择器</param>
-    public static async Task<DisposableConcurrentDictionary<TKey, TElement>> ToDisposableConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector) where TElement : IDisposable
+    public static async Task<DisposableConcurrentDictionary<TKey, TElement>> ToDisposableConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, CancellationToken cancellationToken = default) where TElement : IDisposable
     {
         var dic = new DisposableConcurrentDictionary<TKey, TElement>();
-        await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+        await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item), cancellationToken: cancellationToken);
         return dic;
     }
 
@@ -1093,13 +1094,13 @@ public static class IDictionaryExtensions
     /// <param name="keySelector">键选择器</param>
     /// <param name="elementSelector">值选择器</param>
     /// <param name="defaultValue">键未找到时的默认值</param>
-    public static async Task<DisposableConcurrentDictionary<TKey, TElement>> ToDisposableConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue) where TElement : IDisposable
+    public static async Task<DisposableConcurrentDictionary<TKey, TElement>> ToDisposableConcurrentDictionaryAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, TElement defaultValue, CancellationToken cancellationToken = default) where TElement : IDisposable
     {
         var dic = new DisposableConcurrentDictionary<TKey, TElement>()
         {
             FallbackValue = defaultValue
         };
-        await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item));
+        await source.ForeachAsync(async item => dic[keySelector(item)] = await elementSelector(item), cancellationToken: cancellationToken);
         return dic;
     }
 
@@ -1168,7 +1169,7 @@ public static class IDictionaryExtensions
     /// <param name="source"></param>
     /// <param name="keySelector">键选择器</param>
     /// <param name="elementSelector">值选择器</param>
-    public static async Task<LookupX<TKey, TElement>> ToLookupAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector)
+    public static async Task<LookupX<TKey, TElement>> ToLookupAsync<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, Task<TElement>> elementSelector, CancellationToken cancellationToken = default)
     {
         var items = source as IList<TSource> ?? source.ToList();
         var dic = new ConcurrentDictionary<TKey, List<TElement>>();
@@ -1183,7 +1184,7 @@ public static class IDictionaryExtensions
             {
                 dic.TryAdd(key, new List<TElement> { await elementSelector(item) });
             }
-        });
+        }, cancellationToken: cancellationToken);
         return new LookupX<TKey, TElement>(dic);
     }
 

+ 12 - 2
Masuit.Tools.Abstractions/Extensions/BaseType/IEnumerableExtensions.cs

@@ -789,12 +789,17 @@ public static class IEnumerableExtensions
     /// <param name="selector"></param>
     /// <param name="maxParallelCount">最大并行数</param>
     /// <returns></returns>
-    public static async Task<List<TResult>> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, Task<TResult>> selector, int maxParallelCount)
+    public static async Task<List<TResult>> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, Task<TResult>> selector, int maxParallelCount, CancellationToken cancellationToken = default)
     {
         var results = new List<TResult>();
         var tasks = new List<Task<TResult>>();
         foreach (var item in source)
         {
+            if (cancellationToken.IsCancellationRequested)
+            {
+                break;
+            }
+
             var task = selector(item);
             tasks.Add(task);
             if (tasks.Count >= maxParallelCount)
@@ -819,13 +824,18 @@ public static class IEnumerableExtensions
     /// <param name="selector"></param>
     /// <param name="maxParallelCount">最大并行数</param>
     /// <returns></returns>
-    public static async Task<List<TResult>> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, int, Task<TResult>> selector, int maxParallelCount)
+    public static async Task<List<TResult>> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, int, Task<TResult>> selector, int maxParallelCount, CancellationToken cancellationToken = default)
     {
         var results = new List<TResult>();
         var tasks = new List<Task<TResult>>();
         int index = 0;
         foreach (var item in source)
         {
+            if (cancellationToken.IsCancellationRequested)
+            {
+                break;
+            }
+
             var task = selector(item, index);
             tasks.Add(task);
             Interlocked.Add(ref index, 1);

+ 2 - 2
Masuit.Tools.Abstractions/Extensions/BaseType/StringExtensions.cs

@@ -361,7 +361,7 @@ namespace Masuit.Tools
         /// <param name="s">源字符串</param>
         /// <param name="valid">是否验证有效性</param>
         /// <returns>匹配对象;是否匹配成功,若返回true,则会得到一个Match对象,否则为null</returns>
-        public static async Task<(bool isMatch, Match match)> MatchEmailAsync(this string s, bool valid = false)
+        public static async Task<(bool isMatch, Match match)> MatchEmailAsync(this string s, bool valid = false, CancellationToken cancellationToken = default)
         {
             if (string.IsNullOrEmpty(s) || s.Length < 7)
             {
@@ -374,7 +374,7 @@ namespace Masuit.Tools
             {
                 var nslookup = new LookupClient();
                 using var cts = new CancellationTokenSource(100);
-                var query = await nslookup.QueryAsync(s.Split('@')[1], QueryType.MX, cancellationToken: cts.Token);
+                var query = await nslookup.QueryAsync(s.Split('@')[1], QueryType.MX, cancellationToken: cancellationToken);
                 var result = await query.Answers.MxRecords().SelectAsync(r => Dns.GetHostAddressesAsync(r.Exchange.Value).ContinueWith(t =>
                 {
                     if (t.IsCanceled || t.IsFaulted)

+ 2 - 2
Masuit.Tools.Abstractions/Hardware/SystemInfo.cs

@@ -106,12 +106,12 @@ namespace Masuit.Tools.Hardware
         /// 获取当前进程的CPU使用率(至少需要0.5s)
         /// </summary>
         /// <returns></returns>
-        public static async Task<double> GetCpuUsageForProcess()
+        public static async Task<double> GetCpuUsageForProcess(CancellationToken cancellationToken = default)
         {
             var startTime = DateTime.UtcNow;
             using var p1 = Process.GetCurrentProcess();
             var startCpuUsage = p1.TotalProcessorTime;
-            await Task.Delay(500);
+            await Task.Delay(500, cancellationToken);
             var endTime = DateTime.UtcNow;
             using var p2 = Process.GetCurrentProcess();
             var endCpuUsage = p2.TotalProcessorTime;

+ 124 - 124
Masuit.Tools.Core/Models/IQueryableExt.cs

@@ -5,128 +5,128 @@ namespace Masuit.Tools.Models;
 
 public static partial class IQueryableExt
 {
-	/// <summary>
-	/// 生成分页集合
-	/// </summary>
-	/// <typeparam name="T"></typeparam>
-	/// <param name="query"></param>
-	/// <param name="page">当前页</param>
-	/// <param name="size">页大小</param>
-	/// <returns></returns>
-	public static async Task<PagedList<T>> ToPagedListAsync<T>(this IQueryable<T> query, int page, int size)
-	{
-		var totalCount = await query.CountAsync();
-		if (1L * page * size > totalCount)
-		{
-			page = (int)Math.Ceiling(totalCount / (size * 1.0));
-		}
-
-		if (page <= 0)
-		{
-			page = 1;
-		}
-
-		var list = await query.Skip(size * (page - 1)).Take(size).ToListAsync();
-		return new PagedList<T>(list, page, size, totalCount);
-	}
-
-	/// <summary>
-	/// 生成分页集合
-	/// </summary>
-	/// <typeparam name="T"></typeparam>
-	/// <param name="query"></param>
-	/// <param name="page">当前页</param>
-	/// <param name="size">页大小</param>
-	/// <returns></returns>
-	public static async Task<PagedList<T>> ToPagedListNoLockAsync<T>(this IQueryable<T> query, int page, int size)
-	{
-		var totalCount = await query.CountAsync();
-		if (1L * page * size > totalCount)
-		{
-			page = (int)Math.Ceiling(totalCount / (size * 1.0));
-		}
-
-		if (page <= 0)
-		{
-			page = 1;
-		}
-
-		var list = await query.Skip(size * (page - 1)).Take(size).ToListWithNoLockAsync();
-		return new PagedList<T>(list, page, size, totalCount);
-	}
-
-	/// <summary>
-	/// 生成分页集合
-	/// </summary>
-	/// <typeparam name="T"></typeparam>
-	/// <param name="query"></param>
-	/// <param name="page">当前页</param>
-	/// <param name="size">页大小</param>
-	/// <returns></returns>
-	public static PagedList<T> ToPagedList<T>(this IQueryable<T> query, int page, int size)
-	{
-		var totalCount = query.Count();
-		if (1L * page * size > totalCount)
-		{
-			page = (int)Math.Ceiling(totalCount / (size * 1.0));
-		}
-
-		if (page <= 0)
-		{
-			page = 1;
-		}
-
-		var list = query.Skip(size * (page - 1)).Take(size).ToList();
-		return new PagedList<T>(list, page, size, totalCount);
-	}
-
-	/// <summary>
-	/// 生成分页集合
-	/// </summary>
-	/// <typeparam name="T"></typeparam>
-	/// <param name="query"></param>
-	/// <param name="page">当前页</param>
-	/// <param name="size">页大小</param>
-	/// <returns></returns>
-	public static PagedList<T> ToPagedListNoLock<T>(this IQueryable<T> query, int page, int size)
-	{
-		var totalCount = query.Count();
-		if (1L * page * size > totalCount)
-		{
-			page = (int)Math.Ceiling(totalCount / (size * 1.0));
-		}
-
-		if (page <= 0)
-		{
-			page = 1;
-		}
-
-		var list = query.Skip(size * (page - 1)).Take(size).ToListWithNoLock();
-		return new PagedList<T>(list, page, size, totalCount);
-	}
-
-	/// <summary>
-	/// 生成分页集合
-	/// </summary>
-	/// <typeparam name="T"></typeparam>
-	/// <param name="query"></param>
-	/// <param name="page">当前页</param>
-	/// <param name="size">页大小</param>
-	/// <returns></returns>
-	public static PagedList<T> ToPagedList<T>(this IEnumerable<T> query, int page, int size)
-	{
-		var totalCount = query.Count();
-		if (1L * page * size > totalCount)
-		{
-			page = (int)Math.Ceiling(totalCount / (size * 1.0));
-		}
-
-		if (page <= 0)
-		{
-			page = 1;
-		}
-
-		var list = query.Skip(size * (page - 1)).Take(size).ToList();
-		return new PagedList<T>(list, page, size, totalCount);
-	}
+    /// <summary>
+    /// 生成分页集合
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="query"></param>
+    /// <param name="page">当前页</param>
+    /// <param name="size">页大小</param>
+    /// <returns></returns>
+    public static async Task<PagedList<T>> ToPagedListAsync<T>(this IQueryable<T> query, int page, int size, CancellationToken cancellationToken = default)
+    {
+        var totalCount = await query.CountAsync(cancellationToken: cancellationToken);
+        if (1L * page * size > totalCount)
+        {
+            page = (int)Math.Ceiling(totalCount / (size * 1.0));
+        }
+
+        if (page <= 0)
+        {
+            page = 1;
+        }
+
+        var list = await query.Skip(size * (page - 1)).Take(size).ToListAsync(cancellationToken: cancellationToken);
+        return new PagedList<T>(list, page, size, totalCount);
+    }
+
+    /// <summary>
+    /// 生成分页集合
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="query"></param>
+    /// <param name="page">当前页</param>
+    /// <param name="size">页大小</param>
+    /// <returns></returns>
+    public static async Task<PagedList<T>> ToPagedListNoLockAsync<T>(this IQueryable<T> query, int page, int size, CancellationToken cancellationToken = default)
+    {
+        var totalCount = await query.CountAsync(cancellationToken: cancellationToken);
+        if (1L * page * size > totalCount)
+        {
+            page = (int)Math.Ceiling(totalCount / (size * 1.0));
+        }
+
+        if (page <= 0)
+        {
+            page = 1;
+        }
+
+        var list = await query.Skip(size * (page - 1)).Take(size).ToListWithNoLockAsync(cancellationToken: cancellationToken);
+        return new PagedList<T>(list, page, size, totalCount);
+    }
+
+    /// <summary>
+    /// 生成分页集合
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="query"></param>
+    /// <param name="page">当前页</param>
+    /// <param name="size">页大小</param>
+    /// <returns></returns>
+    public static PagedList<T> ToPagedList<T>(this IQueryable<T> query, int page, int size)
+    {
+        var totalCount = query.Count();
+        if (1L * page * size > totalCount)
+        {
+            page = (int)Math.Ceiling(totalCount / (size * 1.0));
+        }
+
+        if (page <= 0)
+        {
+            page = 1;
+        }
+
+        var list = query.Skip(size * (page - 1)).Take(size).ToList();
+        return new PagedList<T>(list, page, size, totalCount);
+    }
+
+    /// <summary>
+    /// 生成分页集合
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="query"></param>
+    /// <param name="page">当前页</param>
+    /// <param name="size">页大小</param>
+    /// <returns></returns>
+    public static PagedList<T> ToPagedListNoLock<T>(this IQueryable<T> query, int page, int size)
+    {
+        var totalCount = query.Count();
+        if (1L * page * size > totalCount)
+        {
+            page = (int)Math.Ceiling(totalCount / (size * 1.0));
+        }
+
+        if (page <= 0)
+        {
+            page = 1;
+        }
+
+        var list = query.Skip(size * (page - 1)).Take(size).ToListWithNoLock();
+        return new PagedList<T>(list, page, size, totalCount);
+    }
+
+    /// <summary>
+    /// 生成分页集合
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="query"></param>
+    /// <param name="page">当前页</param>
+    /// <param name="size">页大小</param>
+    /// <returns></returns>
+    public static PagedList<T> ToPagedList<T>(this IEnumerable<T> query, int page, int size)
+    {
+        var totalCount = query.Count();
+        if (1L * page * size > totalCount)
+        {
+            page = (int)Math.Ceiling(totalCount / (size * 1.0));
+        }
+
+        if (page <= 0)
+        {
+            page = 1;
+        }
+
+        var list = query.Skip(size * (page - 1)).Take(size).ToList();
+        return new PagedList<T>(list, page, size, totalCount);
+    }
 }

+ 4 - 3
Masuit.Tools.Net45/Media/ImageUtilities.cs

@@ -4,6 +4,7 @@ using System.Drawing.Drawing2D;
 using System.Drawing.Imaging;
 using System.IO;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using Masuit.Tools.Systems;
 
@@ -915,7 +916,7 @@ namespace Masuit.Tools.Media
         /// <param name="bmpp">原始图片</param>
         /// <param name="newW">新的宽度</param>
         /// <param name="newH">新的高度</param>
-        public static async Task<Bitmap> ResizeImageAsync(this Bitmap bmpp, int newW, int newH)
+        public static async Task<Bitmap> ResizeImageAsync(this Bitmap bmpp, int newW, int newH, CancellationToken cancellationToken = default)
         {
             try
             {
@@ -926,7 +927,7 @@ namespace Masuit.Tools.Media
                     g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                     g.DrawImage(bap, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bap.Width, bap.Height), GraphicsUnit.Pixel);
                     return bap;
-                }).ConfigureAwait(false);
+                }, cancellationToken).ConfigureAwait(false);
             }
             catch (Exception)
             {
@@ -1099,4 +1100,4 @@ namespace Masuit.Tools.Media
             return bmpp2;
         }
     }
-}
+}

+ 89 - 90
Masuit.Tools.NoSQL.MongoDBClient/MongoDbClient.cs

@@ -6,6 +6,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq.Expressions;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace Masuit.Tools.NoSQL.MongoDBClient
@@ -103,9 +104,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <typeparam name="T"></typeparam>
         /// <param name="collection">表名</param>
         /// <param name="t">数据</param>
-        public Task InsertOneAsync<T>(string collection, T t)
+        public Task InsertOneAsync<T>(string collection, T t, CancellationToken cancellationToken = default)
         {
-            return Database.GetCollection<T>(collection).InsertOneAsync(t);
+            return Database.GetCollection<T>(collection).InsertOneAsync(t, cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -113,9 +114,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// </summary>
         /// <param name="collection">表名</param>
         /// <param name="doc">文档</param>
-        public Task InsertOneAsync(string collection, BsonDocument doc)
+        public Task InsertOneAsync(string collection, BsonDocument doc, CancellationToken cancellationToken = default)
         {
-            return Database.GetCollection<BsonDocument>(collection).InsertOneAsync(doc);
+            return Database.GetCollection<BsonDocument>(collection).InsertOneAsync(doc, cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -145,9 +146,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <typeparam name="T"></typeparam>
         /// <param name="collection">表名</param>
         /// <param name="list">集合</param>
-        public Task InsertManyAsync<T>(string collection, IEnumerable<T> list)
+        public Task InsertManyAsync<T>(string collection, IEnumerable<T> list, CancellationToken cancellationToken = default)
         {
-            return Database.GetCollection<T>(collection).InsertManyAsync(list);
+            return Database.GetCollection<T>(collection).InsertManyAsync(list, cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -155,9 +156,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// </summary>
         /// <param name="collection">表名</param>
         /// <param name="list">Bson集合</param>
-        public Task InsertManyAsync(string collection, IEnumerable<BsonDocument> list)
+        public Task InsertManyAsync(string collection, IEnumerable<BsonDocument> list, CancellationToken cancellationToken = default)
         {
-            return Database.GetCollection<BsonDocument>(collection).InsertManyAsync(list);
+            return Database.GetCollection<BsonDocument>(collection).InsertManyAsync(list, cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -192,9 +193,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collection">表名</param>
         /// <param name="list">数据集合</param>
         /// <returns></returns>
-        public async Task<List<WriteModel<T>>> BulkInsertAsync<T>(string collection, IEnumerable<WriteModel<T>> list)
+        public async Task<List<WriteModel<T>>> BulkInsertAsync<T>(string collection, IEnumerable<WriteModel<T>> list, CancellationToken cancellationToken = default)
         {
-            BulkWriteResult<T> result = await Database.GetCollection<T>(collection).BulkWriteAsync(list);
+            BulkWriteResult<T> result = await Database.GetCollection<T>(collection).BulkWriteAsync(list, cancellationToken: cancellationToken);
             return result.ProcessedRequests.ToList();
         }
 
@@ -204,9 +205,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collection">表名</param>
         /// <param name="list">Bson数据集合</param>
         /// <returns></returns>
-        public async Task<List<WriteModel<BsonDocument>>> BulkInsertAsync(string collection, IEnumerable<WriteModel<BsonDocument>> list)
+        public async Task<List<WriteModel<BsonDocument>>> BulkInsertAsync(string collection, IEnumerable<WriteModel<BsonDocument>> list, CancellationToken cancellationToken = default)
         {
-            BulkWriteResult<BsonDocument> result = await Database.GetCollection<BsonDocument>(collection).BulkWriteAsync(list);
+            BulkWriteResult<BsonDocument> result = await Database.GetCollection<BsonDocument>(collection).BulkWriteAsync(list, cancellationToken: cancellationToken);
             return result.ProcessedRequests.ToList();
         }
 
@@ -256,12 +257,12 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="update">更新的数据</param>
         /// <param name="upsert">如果它不存在是否插入文档</param>
         /// <returns></returns>
-        public async Task<UpdateResult> UpdateOneAsync<T>(string collection, Expression<Func<T, bool>> filter, UpdateDefinition<T> update, bool upsert)
+        public async Task<UpdateResult> UpdateOneAsync<T>(string collection, Expression<Func<T, bool>> filter, UpdateDefinition<T> update, bool upsert, CancellationToken cancellationToken = default)
         {
             return await Database.GetCollection<T>(collection).UpdateOneAsync(filter, update, new UpdateOptions()
             {
                 IsUpsert = upsert
-            });
+            }, cancellationToken);
         }
 
         /// <summary>
@@ -272,12 +273,12 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="update">更新的数据</param>
         /// <param name="upsert">如果它不存在是否插入文档</param>
         /// <returns></returns>
-        public async Task<UpdateResult> UpdateOneAsync(string collection, Expression<Func<BsonDocument, bool>> filter, UpdateDefinition<BsonDocument> update, bool upsert)
+        public async Task<UpdateResult> UpdateOneAsync(string collection, Expression<Func<BsonDocument, bool>> filter, UpdateDefinition<BsonDocument> update, bool upsert, CancellationToken cancellationToken = default)
         {
             return await Database.GetCollection<BsonDocument>(collection).UpdateOneAsync(filter, update, new UpdateOptions()
             {
                 IsUpsert = upsert
-            });
+            }, cancellationToken);
         }
 
         /// <summary>
@@ -323,12 +324,12 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="update">修改结果</param>
         /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
         /// <returns></returns>
-        public async Task<long> UpdateManyAsync<T>(string collName, Expression<Func<T, bool>> filter, UpdateDefinition<T> update, bool upsert = false)
+        public async Task<long> UpdateManyAsync<T>(string collName, Expression<Func<T, bool>> filter, UpdateDefinition<T> update, bool upsert = false, CancellationToken cancellationToken = default)
         {
             UpdateResult result = await Database.GetCollection<T>(collName).UpdateManyAsync(filter, update, new UpdateOptions
             {
                 IsUpsert = upsert
-            });
+            }, cancellationToken);
             return result.ModifiedCount;
         }
 
@@ -340,12 +341,12 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="update">修改结果</param>
         /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
         /// <returns></returns>
-        public async Task<long> UpdateManyAsync(string collName, Expression<Func<BsonDocument, bool>> filter, UpdateDefinition<BsonDocument> update, bool upsert = false)
+        public async Task<long> UpdateManyAsync(string collName, Expression<Func<BsonDocument, bool>> filter, UpdateDefinition<BsonDocument> update, bool upsert = false, CancellationToken cancellationToken = default)
         {
             UpdateResult result = await Database.GetCollection<BsonDocument>(collName).UpdateManyAsync(filter, update, new UpdateOptions
             {
                 IsUpsert = upsert
-            });
+            }, cancellationToken);
             return result.ModifiedCount;
         }
 
@@ -384,10 +385,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="filter">条件</param>
         /// <param name="update">更新后的数据</param>
         /// <returns></returns>
-        public async Task<T> UpdateOneAsync<T>(string collName, Expression<Func<T, bool>> filter, UpdateDefinition<T> update)
+        public Task<T> UpdateOneAsync<T>(string collName, Expression<Func<T, bool>> filter, UpdateDefinition<T> update, CancellationToken cancellationToken = default)
         {
-            T result = await Database.GetCollection<T>(collName).FindOneAndUpdateAsync(filter, update);
-            return result;
+            return Database.GetCollection<T>(collName).FindOneAndUpdateAsync(filter, update, cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -397,10 +397,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="filter">条件</param>
         /// <param name="update">更新后的Bson数据</param>
         /// <returns></returns>
-        public async Task<BsonDocument> UpdateOneAsync(string collName, Expression<Func<BsonDocument, bool>> filter, UpdateDefinition<BsonDocument> update)
+        public Task<BsonDocument> UpdateOneAsync(string collName, Expression<Func<BsonDocument, bool>> filter, UpdateDefinition<BsonDocument> update, CancellationToken cancellationToken = default)
         {
-            BsonDocument result = await Database.GetCollection<BsonDocument>(collName).FindOneAndUpdateAsync(filter, update);
-            return result;
+            return Database.GetCollection<BsonDocument>(collName).FindOneAndUpdateAsync(filter, update, cancellationToken: cancellationToken);
         }
 
         #endregion 更新
@@ -461,9 +460,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collection">集合名称</param>
         /// <param name="document">文档</param>
         /// <returns></returns>
-        public async Task<long> DeleteAsync<T>(string collection, BsonDocument document)
+        public async Task<long> DeleteAsync<T>(string collection, BsonDocument document, CancellationToken cancellationToken = default)
         {
-            DeleteResult result = await Database.GetCollection<T>(collection).DeleteOneAsync(document);
+            DeleteResult result = await Database.GetCollection<T>(collection).DeleteOneAsync(document, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -473,9 +472,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collection">集合名称</param>
         /// <param name="document">文档</param>
         /// <returns></returns>
-        public async Task<long> DeleteManyAsync<T>(string collection, BsonDocument document)
+        public async Task<long> DeleteManyAsync<T>(string collection, BsonDocument document, CancellationToken cancellationToken = default)
         {
-            DeleteResult result = await Database.GetCollection<T>(collection).DeleteManyAsync(document);
+            DeleteResult result = await Database.GetCollection<T>(collection).DeleteManyAsync(document, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -485,9 +484,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collection">集合名称</param>
         /// <param name="document">文档</param>
         /// <returns></returns>
-        public async Task<long> DeleteAsync(string collection, BsonDocument document)
+        public async Task<long> DeleteAsync(string collection, BsonDocument document, CancellationToken cancellationToken = default)
         {
-            DeleteResult result = await Database.GetCollection<BsonDocument>(collection).DeleteOneAsync(document);
+            DeleteResult result = await Database.GetCollection<BsonDocument>(collection).DeleteOneAsync(document, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -497,9 +496,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collection">集合名称</param>
         /// <param name="document">文档</param>
         /// <returns></returns>
-        public async Task<long> DeleteManyAsync(string collection, BsonDocument document)
+        public async Task<long> DeleteManyAsync(string collection, BsonDocument document, CancellationToken cancellationToken = default)
         {
-            DeleteResult result = await Database.GetCollection<BsonDocument>(collection).DeleteManyAsync(document);
+            DeleteResult result = await Database.GetCollection<BsonDocument>(collection).DeleteManyAsync(document, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -569,9 +568,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="json">json字符串</param>
         /// <returns></returns>
-        public async Task<long> DeleteManyAsync<T>(string collName, string json)
+        public async Task<long> DeleteManyAsync<T>(string collName, string json, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<T>(collName).DeleteManyAsync(json);
+            var result = await Database.GetCollection<T>(collName).DeleteManyAsync(json, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -581,9 +580,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="json">json字符串</param>
         /// <returns></returns>
-        public async Task<long> DeleteAsync(string collName, string json)
+        public async Task<long> DeleteAsync(string collName, string json, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<BsonDocument>(collName).DeleteOneAsync(json);
+            var result = await Database.GetCollection<BsonDocument>(collName).DeleteOneAsync(json, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -593,9 +592,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="json">json字符串</param>
         /// <returns></returns>
-        public async Task<long> DeleteManyAsync(string collName, string json)
+        public async Task<long> DeleteManyAsync(string collName, string json, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<BsonDocument>(collName).DeleteManyAsync(json);
+            var result = await Database.GetCollection<BsonDocument>(collName).DeleteManyAsync(json, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -653,9 +652,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="predicate">条件表达式</param>
         /// <returns></returns>
-        public async Task<long> DeleteAsync<T>(string collName, Expression<Func<T, bool>> predicate)
+        public async Task<long> DeleteAsync<T>(string collName, Expression<Func<T, bool>> predicate, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<T>(collName).DeleteOneAsync(predicate);
+            var result = await Database.GetCollection<T>(collName).DeleteOneAsync(predicate, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -665,9 +664,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="predicate">条件表达式</param>
         /// <returns></returns>
-        public async Task<long> DeleteManyAsync<T>(string collName, Expression<Func<T, bool>> predicate)
+        public async Task<long> DeleteManyAsync<T>(string collName, Expression<Func<T, bool>> predicate, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<T>(collName).DeleteManyAsync(predicate);
+            var result = await Database.GetCollection<T>(collName).DeleteManyAsync(predicate, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -677,9 +676,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="predicate">条件表达式</param>
         /// <returns></returns>
-        public async Task<long> DeleteAsync(string collName, Expression<Func<BsonDocument, bool>> predicate)
+        public async Task<long> DeleteAsync(string collName, Expression<Func<BsonDocument, bool>> predicate, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<BsonDocument>(collName).DeleteOneAsync(predicate);
+            var result = await Database.GetCollection<BsonDocument>(collName).DeleteOneAsync(predicate, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -689,9 +688,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="predicate">条件表达式</param>
         /// <returns></returns>
-        public async Task<long> DeleteManyAsync(string collName, Expression<Func<BsonDocument, bool>> predicate)
+        public async Task<long> DeleteManyAsync(string collName, Expression<Func<BsonDocument, bool>> predicate, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<BsonDocument>(collName).DeleteManyAsync(predicate);
+            var result = await Database.GetCollection<BsonDocument>(collName).DeleteManyAsync(predicate, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -754,9 +753,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<long> DeleteAsync<T>(string collName, FilterDefinition<T> filter)
+        public async Task<long> DeleteAsync<T>(string collName, FilterDefinition<T> filter, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<T>(collName).DeleteOneAsync(filter);
+            var result = await Database.GetCollection<T>(collName).DeleteOneAsync(filter, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -767,9 +766,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<long> DeleteManyAsync<T>(string collName, FilterDefinition<T> filter)
+        public async Task<long> DeleteManyAsync<T>(string collName, FilterDefinition<T> filter, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<T>(collName).DeleteManyAsync(filter);
+            var result = await Database.GetCollection<T>(collName).DeleteManyAsync(filter, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -780,9 +779,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<long> DeleteAsync(string collName, FilterDefinition<BsonDocument> filter)
+        public async Task<long> DeleteAsync(string collName, FilterDefinition<BsonDocument> filter, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<BsonDocument>(collName).DeleteOneAsync(filter);
+            var result = await Database.GetCollection<BsonDocument>(collName).DeleteOneAsync(filter, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -793,9 +792,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">集合名称</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<long> DeleteManyAsync(string collName, FilterDefinition<BsonDocument> filter)
+        public async Task<long> DeleteManyAsync(string collName, FilterDefinition<BsonDocument> filter, CancellationToken cancellationToken = default)
         {
-            var result = await Database.GetCollection<BsonDocument>(collName).DeleteManyAsync(filter);
+            var result = await Database.GetCollection<BsonDocument>(collName).DeleteManyAsync(filter, cancellationToken);
             return result.DeletedCount;
         }
 
@@ -831,9 +830,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">表名</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<T> DeleteOneAsync<T>(string collName, Expression<Func<T, bool>> filter)
+        public async Task<T> DeleteOneAsync<T>(string collName, Expression<Func<T, bool>> filter, CancellationToken cancellationToken = default)
         {
-            T result = await Database.GetCollection<T>(collName).FindOneAndDeleteAsync(filter);
+            T result = await Database.GetCollection<T>(collName).FindOneAndDeleteAsync(filter, cancellationToken: cancellationToken);
             return result;
         }
 
@@ -843,9 +842,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">表名</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<BsonDocument> DeleteOneAsync(string collName, Expression<Func<BsonDocument, bool>> filter)
+        public async Task<BsonDocument> DeleteOneAsync(string collName, Expression<Func<BsonDocument, bool>> filter, CancellationToken cancellationToken = default)
         {
-            BsonDocument result = await Database.GetCollection<BsonDocument>(collName).FindOneAndDeleteAsync(filter);
+            BsonDocument result = await Database.GetCollection<BsonDocument>(collName).FindOneAndDeleteAsync(filter, cancellationToken: cancellationToken);
             return result;
         }
 
@@ -905,10 +904,10 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">表名</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<T> GetAsync<T>(string collName, FilterDefinition<T> filter)
+        public async Task<T> GetAsync<T>(string collName, FilterDefinition<T> filter, CancellationToken cancellationToken = default)
         {
-            IAsyncCursor<T> find = await Database.GetCollection<T>(collName).FindAsync(filter);
-            return await find.FirstOrDefaultAsync();
+            IAsyncCursor<T> find = await Database.GetCollection<T>(collName).FindAsync(filter, cancellationToken: cancellationToken);
+            return await find.FirstOrDefaultAsync(cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -917,10 +916,10 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">表名</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<BsonDocument> GetAsync(string collName, FilterDefinition<BsonDocument> filter)
+        public async Task<BsonDocument> GetAsync(string collName, FilterDefinition<BsonDocument> filter, CancellationToken cancellationToken = default)
         {
-            IAsyncCursor<BsonDocument> find = await Database.GetCollection<BsonDocument>(collName).FindAsync(filter);
-            return await find.FirstOrDefaultAsync();
+            IAsyncCursor<BsonDocument> find = await Database.GetCollection<BsonDocument>(collName).FindAsync(filter, cancellationToken: cancellationToken);
+            return await find.FirstOrDefaultAsync(cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -955,9 +954,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">表名</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<IEnumerable<T>> GetManyAsync<T>(string collName, FilterDefinition<T> filter)
+        public async Task<IEnumerable<T>> GetManyAsync<T>(string collName, FilterDefinition<T> filter, CancellationToken cancellationToken = default)
         {
-            IAsyncCursor<T> find = await Database.GetCollection<T>(collName).FindAsync(filter);
+            IAsyncCursor<T> find = await Database.GetCollection<T>(collName).FindAsync(filter, cancellationToken: cancellationToken);
             return find.ToEnumerable();
         }
 
@@ -967,9 +966,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">表名</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<IEnumerable<BsonDocument>> GetManyAsync(string collName, FilterDefinition<BsonDocument> filter)
+        public async Task<IEnumerable<BsonDocument>> GetManyAsync(string collName, FilterDefinition<BsonDocument> filter, CancellationToken cancellationToken = default)
         {
-            IAsyncCursor<BsonDocument> find = await Database.GetCollection<BsonDocument>(collName).FindAsync(filter);
+            IAsyncCursor<BsonDocument> find = await Database.GetCollection<BsonDocument>(collName).FindAsync(filter, cancellationToken: cancellationToken);
             return find.ToEnumerable();
         }
 
@@ -1004,10 +1003,10 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">表名</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<bool> AnyAsync<T>(string collName, FilterDefinition<T> filter)
+        public async Task<bool> AnyAsync<T>(string collName, FilterDefinition<T> filter, CancellationToken cancellationToken = default)
         {
-            IAsyncCursor<T> find = await Database.GetCollection<T>(collName).FindAsync(filter);
-            return await find.AnyAsync();
+            IAsyncCursor<T> find = await Database.GetCollection<T>(collName).FindAsync(filter, cancellationToken: cancellationToken);
+            return await find.AnyAsync(cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -1016,10 +1015,10 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collName">表名</param>
         /// <param name="filter">条件</param>
         /// <returns></returns>
-        public async Task<bool> AnyAsync(string collName, FilterDefinition<BsonDocument> filter)
+        public async Task<bool> AnyAsync(string collName, FilterDefinition<BsonDocument> filter, CancellationToken cancellationToken = default)
         {
-            IAsyncCursor<BsonDocument> find = await Database.GetCollection<BsonDocument>(collName).FindAsync(filter);
-            return await find.AnyAsync();
+            IAsyncCursor<BsonDocument> find = await Database.GetCollection<BsonDocument>(collName).FindAsync(filter, cancellationToken: cancellationToken);
+            return await find.AnyAsync(cancellationToken: cancellationToken);
         }
 
         #endregion 查询
@@ -1055,15 +1054,15 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="index">索引键</param>
         /// <param name="asc"></param>
         /// <returns></returns>
-        public async Task<string> CreateIndexAsync(string collection, string index, bool asc = true)
+        public async Task<string> CreateIndexAsync(string collection, string index, bool asc = true, CancellationToken cancellationToken = default)
         {
             IMongoIndexManager<BsonDocument> mgr = Database.GetCollection<BsonDocument>(collection).Indexes;
-            var list = mgr.List();
-            while (list.MoveNext())
+            var list = await mgr.ListAsync(cancellationToken);
+            while (await list.MoveNextAsync(cancellationToken))
             {
                 if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index)))
                 {
-                    return await mgr.CreateOneAsync(new CreateIndexModel<BsonDocument>(asc ? Builders<BsonDocument>.IndexKeys.Ascending(doc => doc[index]) : Builders<BsonDocument>.IndexKeys.Descending(doc => doc[index])));
+                    return await mgr.CreateOneAsync(new CreateIndexModel<BsonDocument>(asc ? Builders<BsonDocument>.IndexKeys.Ascending(doc => doc[index]) : Builders<BsonDocument>.IndexKeys.Descending(doc => doc[index])), cancellationToken: cancellationToken);
                 }
             }
 
@@ -1090,10 +1089,10 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="index">索引键</param>
         /// <param name="asc"></param>
         /// <returns></returns>
-        public async Task<string> UpdateIndexAsync(string collection, string index, bool asc = true)
+        public async Task<string> UpdateIndexAsync(string collection, string index, bool asc = true, CancellationToken cancellationToken = default)
         {
             IMongoIndexManager<BsonDocument> mgr = Database.GetCollection<BsonDocument>(collection).Indexes;
-            return await mgr.CreateOneAsync(new CreateIndexModel<BsonDocument>(asc ? Builders<BsonDocument>.IndexKeys.Ascending(doc => doc[index]) : Builders<BsonDocument>.IndexKeys.Descending(doc => doc[index])));
+            return await mgr.CreateOneAsync(new CreateIndexModel<BsonDocument>(asc ? Builders<BsonDocument>.IndexKeys.Ascending(doc => doc[index]) : Builders<BsonDocument>.IndexKeys.Descending(doc => doc[index])), cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -1113,9 +1112,9 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="collection">集合名</param>
         /// <param name="index">索引键</param>
         /// <returns></returns>
-        public Task DropIndexAsync(string collection, string index)
+        public Task DropIndexAsync(string collection, string index, CancellationToken cancellationToken = default)
         {
-            return Database.GetCollection<BsonDocument>(collection).Indexes.DropOneAsync(index);
+            return Database.GetCollection<BsonDocument>(collection).Indexes.DropOneAsync(index, cancellationToken);
         }
 
         /// <summary>
@@ -1149,15 +1148,15 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="key"></param>
         /// <param name="asc"></param>
         /// <returns></returns>
-        public async Task<string> CreateIndexAsync<T>(string collection, string index, Expression<Func<T, object>> key, bool asc = true)
+        public async Task<string> CreateIndexAsync<T>(string collection, string index, Expression<Func<T, object>> key, bool asc = true, CancellationToken cancellationToken = default)
         {
             IMongoIndexManager<T> mgr = Database.GetCollection<T>(collection).Indexes;
-            var list = mgr.List();
-            while (list.MoveNext())
+            var list = await mgr.ListAsync(cancellationToken);
+            while (await list.MoveNextAsync(cancellationToken))
             {
                 if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index)))
                 {
-                    return await mgr.CreateOneAsync(new CreateIndexModel<T>(asc ? Builders<T>.IndexKeys.Ascending(key) : Builders<T>.IndexKeys.Descending(key)));
+                    return await mgr.CreateOneAsync(new CreateIndexModel<T>(asc ? Builders<T>.IndexKeys.Ascending(key) : Builders<T>.IndexKeys.Descending(key)), cancellationToken: cancellationToken);
                 }
             }
 
@@ -1184,10 +1183,10 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         /// <param name="key"></param>
         /// <param name="asc"></param>
         /// <returns></returns>
-        public async Task<string> UpdateIndexAsync<T>(string collection, Expression<Func<T, object>> key, bool asc = true)
+        public async Task<string> UpdateIndexAsync<T>(string collection, Expression<Func<T, object>> key, bool asc = true, CancellationToken cancellationToken = default)
         {
             IMongoIndexManager<T> mgr = Database.GetCollection<T>(collection).Indexes;
-            return await mgr.CreateOneAsync(new CreateIndexModel<T>(asc ? Builders<T>.IndexKeys.Ascending(key) : Builders<T>.IndexKeys.Descending(key)));
+            return await mgr.CreateOneAsync(new CreateIndexModel<T>(asc ? Builders<T>.IndexKeys.Ascending(key) : Builders<T>.IndexKeys.Descending(key)), cancellationToken: cancellationToken);
         }
 
         #endregion 索引