当前位置: 首页 > news >正文

钻戒网站建设需求wordpress后台代码

钻戒网站建设需求,wordpress后台代码,厦门建公司网站,wordpress地方信息主题文章目录 前言一、异步互斥锁的作用是什么?示例一、创建和销毁 二、如何实现?1、标识(1)标识是否锁住(2)加锁(3)解锁 2、异步通知(1)创建对象(2&a…

文章目录

  • 前言
  • 一、异步互斥锁的作用是什么?
    • 示例一、创建和销毁
  • 二、如何实现?
    • 1、标识
      • (1)标识是否锁住
      • (2)加锁
      • (3)解锁
    • 2、异步通知
      • (1)创建对象
      • (2)返回Task
      • (3)通知完成
    • 3、等待队列
      • (1)创建队列
      • (2) 等待加锁
      • (3)加锁成功
  • 三、完整代码
  • 四、使用示例
    • 1、基本用法
    • 2、尝试加锁
    • 3、加锁对比
      • (1)未加锁
      • (2)加锁
  • 总结


前言

C#对异步的支持越来越成熟,async、await简化了代码也提高了可读性,但由于在一段上下文中有了异步操作,意味着这段操作可能会被同时重复调用,如果本身没有被设计可以重复调用的情况下,就很可能会出问题。


一、异步互斥锁的作用是什么?

异步互斥锁的作用是用于确保存在异步操作的上下文同步互斥。可以参考flutter的插件mutex功能与本文基本一样。

示例一、创建和销毁

有创建和销毁两个方法,两个方法中都有异步操作,两个方法可以单独调用,但不可以同时调用。
单线程中连续调用创建和销毁(不在同一个上下文无法用await),如果没有互斥限制有可能出现如下的操作:

创建开始->创建异步操作->消息队列->销毁开始->销毁异步操作->消息队列->销毁完成->消息队列->创建完成

加入异步互斥锁之后

加锁->创建开始->创建完成->解锁
加锁等待->销毁开始->销毁完成->解锁

二、如何实现?

由于操作都是在单线程我们直接用标识+队列就可以实现一个互斥锁。

1、标识

(1)标识是否锁住

bool _lock = false;

(2)加锁

_lock=true;

(3)解锁

_lock=false;

2、异步通知

通过TaskCompletionSource可以实现异步通知

(1)创建对象

var tcs = new TaskCompletionSource();

(2)返回Task

return tcs.Task;

(3)通知完成

tcs.SetResult();

3、等待队列

用一个队列来记录等待加锁的请求。

(1)创建队列

Queue<TaskCompletionSource> _queue = new Queue<TaskCompletionSource>();

(2) 等待加锁

_queue.Enqueue(tcs);

(3)加锁成功

_queue.Dequeue().SetResult();

三、完整代码

/// <summary>
/// 异步锁,非线程锁,只能用于单线程异步环境中。
/// </summary>
class AsyncMutex
{Queue<TaskCompletionSource> _queue = new Queue<TaskCompletionSource>();bool _lock = false;/// <summary>/// 获取锁/// </summary>/// <returns>返回Task,await后即进入了锁</returns>public Task Acquire(){if (_lock){var tcs = new TaskCompletionSource();_queue.Enqueue(tcs);return tcs.Task;}_lock = true;return Task.CompletedTask;}/// <summary>/// 尝试获取锁/// 因为是单线程环境,重复调用需要切换上下文,否则是无法成功的。/// 比如可以await Task.Delay(30);/// </summary>/// <returns>是否成功</returns>public bool TryAcquire(){if (_lock) return false;return _lock = true;}/// <summary>/// 释放锁/// </summary>public void Release(){if (_queue.Count > 0){_queue.Dequeue().SetResult();}else{_lock = false;}}
}

四、使用示例

1、基本用法

直接加锁

AsyncMutex _mtx = new AsyncMutex();
async void test()
{await _mtx.Acquire();//custom code_mtx.Release();
}

2、尝试加锁

加锁成功才执行操作

AsyncMutex _mtx = new AsyncMutex();
void test()
{if (_mtx.TryAcquire()){//custom code_mtx.Release();}
}

超时等待

AsyncMutex _mtx = new AsyncMutex();
async void test()
{//超时等待300msbool isLock = false;for (int i = 0; i < 10; i++){if (isLock = _mtx.TryAcquire()) break;await Task.Delay(30);}if (isLock){//custom code_mtx.Release();}
}

3、加锁对比

(1)未加锁

async void test(int num)
{Console.WriteLine("enter " + num);//模拟异步操作await Task.Delay(10);Console.WriteLine("exit " + num);
}
//.net 6.0
test(1);
test(2);
test(3);

可能出现的组合,效果预览
在这里插入图片描述

(2)加锁

AsyncMutex _mtx = new AsyncMutex();
async void test(int num)
{await _mtx.Acquire();Console.WriteLine("enter " + num);//模拟异步操作await Task.Delay(10);Console.WriteLine("exit " + num);_mtx.Release();
}
//.net 6.0
test(1);
test(2);
test(3);

效果预览
在这里插入图片描述


总结

以上就是今天要讲的内容,本文简单的实现了单线程的异步互斥锁,实现起来相对简单,但作用还是比较大的。虽然说有些情况的异步是可以在前期设计上避免同时调用,比如登录按钮点击后出现蒙板不允许再次点击,但是对于已存在的代码出现了同时调用问题,此时有互斥锁则可以避免大范围改动代码,有效解决问题。

http://www.yayakq.cn/news/868875/

相关文章:

  • 建个企业网站要多少钱wordpress escattr
  • 建设网站ppt模板个人怎么注册自己的网站
  • 制作企业网站平台备案期间怎么访问网站
  • 唐山做企业网站的公司怡清源企业网站建设可行性分析
  • 青岛济南网站建设优化网站的mysql数据库放到服务器上服务器需要安装mysql吗?
  • 可以用来做论文引用的网站上海设计公司官网
  • 网站推广方案途径西安千秋网络科技有限公司怎么样
  • 网站定制设计制作公司聊城网络科技有限公司
  • 惠州市企业网站seo点击软件旅游网站怎么做才能被关注
  • 网站页面大小优化怎么做深圳网站建设 迈
  • 新建网站后域名跳转到别的网站了网站首页的重要性
  • 甪直做网站 上软件免费下载
  • 网站开发人员工具下载视频温州如何进行网站推广
  • 太仓高端网站制作模仿wordpress主题
  • 湖州企业网站制作多个网站对比表格怎么做
  • 深圳电信网站备案推广链接赚钱
  • 聊城网站建设动态做哪些网站好
  • 深圳住房和建设局新网站网页字体导入wordpress
  • 顺的网站建设效果个人网站icp
  • word可以做招聘网站吗主页推广项目计划书
  • 建网站的地址做ppt好的模板下载网站有哪些
  • 网站建设网站制作提供服务可以做公众号的网站吗
  • 陕西住房建设厅考试官方网站做网站都需要学什么语言
  • 郑州网站建设兼职做网站的报价方案
  • 天津网络推广网站建设公司哈尔滨网络建设网络优化
  • 哈尔滨网站建设技术托管WordPress如何设置邮箱验证
  • 医院网站建设 费用前端开发培训机构有哪些
  • 青岛建设网站公司简单的网站有哪些
  • 图片设计网站免费手机免费制作ppt
  • 时尚网站的建设策划杭州公司注册地址