using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleAppNET7
{
public class UploadFile
{
static UploadFile()
{
Task.Run(() =>
{
while (true)
{
try
{
Delegate[] delegates = ImgCalcAmount.GetInvocationList();
Console.Out.WriteLine("注册事件数" + delegates.Length);
}
catch (Exception ex)
{
Console.WriteLine("事件数量为0,获取异常," + ex.Message);
break;
}
Thread.Sleep(100);
}
});
}
/// <summary>
/// 小图片数量,通知
/// </summary>
public static event EventHandler<string> ImgCalcAmount;
/// <summary>
/// 上传文件
/// </summary>
/// <param name="html"></param>
/// <param name="articleId"></param>
/// <param name="user"></param>
/// <returns></returns>
public static async Task<Dictionary<string, string>> UploadFileWork(string html, string articleId, string user)
{
Dictionary<string, string> dict = new Dictionary<string, string>();
await Task.Delay(100);
//计算小图数量
int count = int.Parse(articleId.Last().ToString()) + 1;
for (int i = 0; i < count; i++)
{
if (count % 2 == 0)
{
await Task.Delay(3000);
}
if (count % 3 == 0)
{
await Task.Delay(1000);
}
//找到一张小图片,通知调用方,小图数量 +1
ImgCalcAmount?.Invoke(1, articleId);
}
return dict;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleAppNET7
{
internal class BusinessTest
{
public static async Task PublishArticle(string articleId)
{
short imgAmount = 0; /* 小图数量计数 */
EventHandler<string> action = (o, e) =>
{
if (e == articleId)
{
imgAmount = (short)(imgAmount + 1);
}
};
UploadFile.ImgCalcAmount += action;
//上传文件处理
await UploadFile.UploadFileWork("文章内容html", articleId, "李斯");
//移除注册
UploadFile.ImgCalcAmount -= action;
//上传完成;
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")},文章{articleId},小图片数{imgAmount}");
}
}
}
// See https://aka.ms/new-console-template for more information
using ClassLibrary.Tool;
using ConsoleAppNET7;
Console.WriteLine("Hello, World!");
//
for (int i = 0; i < 10; i++) {
BusinessTest.PublishArticle("1000"+i);
}
Task.Delay(2000).Wait();
for (int i = 0; i < 10; i++)
{
BusinessTest.PublishArticle("2000" + i);
}
Console.WriteLine("程序结束----");
Console.ReadKey();
文章来源地址https://www.toymoban.com/news/detail-658567.html
文章来源:https://www.toymoban.com/news/detail-658567.html
到了这里,关于c#防止事件重复注册,调用后就移除注册,跨程序集的事件订阅的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!