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

h5网站建设方案.doc湖南营销型网站建设价格

h5网站建设方案.doc,湖南营销型网站建设价格,公司建设网站需要固定ip吗,事业单位网站备案流程一、async/await 异步编程实现机制 1.1 核心概念 async/await 是 C# 5.0 引入的语法糖,它基于**状态机(State Machine)**模式实现,将异步方法转换为编译器生成的状态机类。 1.2 编译器转换过程 当编译器遇到 async 方法时&#xf…

一、async/await 异步编程实现机制

1.1 核心概念

async/await 是 C# 5.0 引入的语法糖,它基于**状态机(State Machine)**模式实现,将异步方法转换为编译器生成的状态机类。

1.2 编译器转换过程

当编译器遇到 async 方法时,会将其转换为一个实现了 IAsyncStateMachine 接口的状态机类。

// 原始代码
public async Task<int> GetDataAsync()
{await Task.Delay(1000);return 42;
}

编译器会将其转换为类似以下结构:

// 伪代码:编译器生成的状态机
[CompilerGenerated]
private sealed class <GetDataAsync>d__1 : IAsyncStateMachine
{public int <>1__state;public AsyncTaskMethodBuilder<int> <>t__builder;public YourClass <>4__this;private TaskAwaiter <>u__1;public void MoveNext(){int num = <>1__state;try{TaskAwaiter awaiter;if (num != 0){awaiter = Task.Delay(1000).GetAwaiter();if (!awaiter.IsCompleted){<>1__state = 0;<>u__1 = awaiter;<>t__builder.AwaitOnCompleted(ref awaiter, ref this);return;}}else{awaiter = <>u__1;<>u__1 = default(TaskAwaiter);<>1__state = -1;}awaiter.GetResult(); // 清理异常<>t__builder.SetResult(42); // 设置返回值}catch (Exception e){<>1__state = -2;<>t__builder.SetException(e);return;}}public void SetStateMachine(IAsyncStateMachine stateMachine){<>t__builder.SetStateMachine(stateMachine);}
}

1.3 关键组件解析

1.3.1 AsyncTaskMethodBuilder
  • 负责管理异步方法的生命周期
  • 包含 Task 的创建、状态管理和结果设置
  • 提供 AwaitOnCompletedSetResultSetException 等方法
1.3.2 状态机工作流程
  1. 初始状态 (<>1__state = -1):方法开始执行
  2. 等待状态 (<>1__state = 0):遇到 await 且任务未完成
  3. 完成状态 (<>1__state = -2):方法执行完毕或发生异常
1.3.3 await 操作的执行过程
  1. 调用 GetAwaiter() 获取 TaskAwaiter
  2. 检查 IsCompleted 属性
  3. 如果未完成:
    • 保存当前状态
    • 注册 continuation 回调
    • 返回控制权给调用者
  4. 如果已完成:继续执行后续代码

1.4 上下文捕获(Context Capture)

await 默认会捕获当前的 SynchronizationContextTaskScheduler

public async Task ProcessAsync()
{// 捕获当前上下文await SomeAsyncOperation();// 回到原始上下文执行后续代码UpdateUI(); // 在UI线程上执行
}

二、死锁产生的原因

2.1 同步阻塞导致的死锁

最常见的死锁场景:在同步代码中阻塞等待异步操作完成。

// 危险代码 - 可能导致死锁
public int GetData()
{// 死锁!等待异步方法完成return GetDataAsync().Result;
}public async Task<int> GetDataAsync()
{await Task.Delay(1000);return 42;
}

死锁形成过程:

  1. GetData() 调用 GetDataAsync()
  2. GetDataAsync() 开始执行,遇到 await
  3. 线程池线程被释放,GetData() 在主线程阻塞等待
  4. await 完成后,需要回到原始上下文(主线程)继续执行
  5. 但主线程被 Result 阻塞,无法执行 continuation
  6. 形成死锁

2.2 UI线程死锁

在WinForms/WPF应用中特别常见:

private async void Button_Click(object sender, EventArgs e)
{// 危险:在UI事件中同步等待var result = GetDataAsync().Result;textBox.Text = result.ToString();
}

2.3 ASP.NET 经典死锁

在ASP.NET Framework中:

public ActionResult GetData()
{// 可能死锁var data = GetDataAsync().Result;return Json(data);
}

三、死锁解决方案

3.1 根本原则:避免同步阻塞

错误做法:

// ❌ 避免使用
var result = DoAsync().Result;
var result = DoAsync().Wait();
var result = DoAsync().GetAwaiter().GetResult();

正确做法:

// ✅ 使用 async/await 链式调用
public async Task<int> GetDataAsync()
{return await GetDataAsync();
}

3.2 解决方案一:异步编程链

将同步方法改为异步:

// 原始同步方法
public int GetData()
{return GetDataAsync().Result; // 死锁风险
}// 改为异步方法
public async Task<int> GetDataAsync()
{return await GetDataAsync();
}// 调用者也需要异步
public async Task ProcessAsync()
{var data = await GetDataAsync();// 处理数据
}

3.3 解决方案二:ConfigureAwait(false)

在类库中使用 ConfigureAwait(false) 避免上下文捕获:

public async Task<int> GetDataAsync()
{// 不捕获上下文,避免死锁await Task.Delay(1000).ConfigureAwait(false);// 继续异步操作await AnotherAsyncOperation().ConfigureAwait(false);return 42;
}

使用场景:

  • 类库开发
  • 不需要访问UI组件的后台操作
  • ASP.NET Core 应用

3.4 解决方案三:创建新线程执行

当必须同步调用时,使用新线程:

public int GetData()
{// 在新线程中执行异步方法return Task.Run(async () => await GetDataAsync()).Result;
}

四、最佳实践

4.1 类库开发

// 类库中始终使用 ConfigureAwait(false)
public async Task<ServiceResult> CallServiceAsync()
{var response = await httpClient.GetAsync(url).ConfigureAwait(false);var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);return JsonConvert.DeserializeObject<ServiceResult>(content);
}

4.2 UI应用开发

// UI事件处理保持异步
private async void Button_Click(object sender, EventArgs e)
{try{button.Enabled = false;var result = await GetDataAsync(); // 不使用 .ResulttextBox.Text = result.ToString();}catch (Exception ex){MessageBox.Show(ex.Message);}finally{button.Enabled = true;}
}

4.3 异步Main方法

// .NET 4.7.1+ 支持 async Main
static async Task<int> Main(string[] args)
{try{await ProcessAsync();return 0;}catch (Exception ex){Console.WriteLine(ex.Message);return 1;}
}

五、总结

  1. async/await 是基于状态机的编译器魔法
  2. 死锁 主要由同步阻塞和上下文捕获引起
  3. 最佳解决方案 是保持异步调用链
  4. 类库开发 应使用 ConfigureAwait(false)
  5. 避免 在异步代码中使用 .Result.Wait()

遵循这些原则,可以安全高效地使用C#的异步编程模型。

http://www.dtcms.com/a/534744.html

相关文章:

  • 大学国际化网站建设个人网站设计模板中文
  • 网站大全软件下载工程施工合同协议书范本
  • 什么样的网站开发比较吃香中国建筑集团有限公司官网测评网址
  • 广州网站开发定制需要多少钱永川网站设计
  • 微擎微网站开发网络科技公司网站源码
  • 谷歌网站站长指南网站设计的要求有哪些
  • 渭南网站制作学校播州区建设局网站
  • 如何与对方网站做相互链接做优化网站注意什么
  • 展示型网站建设流程网页怎么绑定wordpress
  • 辽宁住房建设部网站怎么让wordpress
  • 奉贤做网站制作1688域名网站
  • 免费奖励代码网站新闻静态网站咋做
  • 网站建设营销外包公司排名中国交通建设监理协会网站打不开
  • 免费手机建站平台wordpress调用page
  • 网站开发概要设计二建报名时间2023年报名时间
  • ps做图游戏下载网站有哪些内容网页设计改版
  • 定制家具网站平台网站开发就业培训班
  • 网站建设的网站分析怎么写做直播网站赚钱吗
  • 有什么网站可以做婚庆视频素材靖安县城乡规划建设局网站
  • 外国做爰网站wordpress多站批量发布
  • 网站调用字体电商运营数据分析表格
  • 做一个招聘信息的网站_用什么做网站的软件公司电子商务网站建设规划方案
  • 网站建设的意义以及重要性宋朝网站应该怎么做
  • 注册网站需要房产证多用户商城源码下载
  • 昆明专业网站建设的公司网络平台运营计划方案
  • 男女做爰高清免费网站免费3d建模软件
  • 佛山网站建设机构wordpress 满屏主题
  • 沙坪坝网站开发WordPress简单百度站长插件
  • 便宜建站vps永安市建设局网站
  • 北京网站制作与网站设计化妆品网站的建设 论文