await 与 SynchronizationContext 关系

static async Task DoStep()
{
  //step 1 Debug.WriteLine(
"DoStep Start thread id: " + System.Threading.Thread.CurrentThread.ManagedThreadId + "|" + System.Threading.Thread.CurrentThread.IsThreadPoolThread); await Task.Run(async () => {   Debug.WriteLine("Task thread id: " + System.Threading.Thread.CurrentThread.ManagedThreadId + "|" + System.Threading.Thread.CurrentThread.IsThreadPoolThread); });
//这里会出现线程上下文切换
  //如果
SynchronizationContext.Current is not null,就使用await之前的线程,与 step1保持一致,注意不要再挂起调用前的线程,否则会出现死锁。
  //如果 SynchronizationContext.Current is null,就使用线程池中处理await的线程,与 step1 不保持一致,注意在这之后不能直接使用UI控件,只能通过this.BeginInvoke调用。
  //如Task.Run之后配置 ConfigureAwait(false),就使用线程池中处理await的线程,与 step1 不保持一致,注意在这之后不能直接使用UI控件,只能通过this.BeginInvoke调用。
  Debug.WriteLine("DoStep End thread id: " + System.Threading.Thread.CurrentThread.ManagedThreadId + "|" + System.Threading.Thread.CurrentThread.IsThreadPoolThread); 
   Debug.WriteLine(SynchronizationContext.Current == null ? "null" : SynchronizationContext.Current.ToString());  
}

 

转载于:https://www.cnblogs.com/yipeng-yu/p/5511898.html

`await` 和 `async` 是两种在 JavaScript 中用于处理异步操作的关键字。它们通常一起使用,以使代码更清晰、更易于理解,特别是在处理长时间运行的操作时。 **async** `async` 是一个函数修饰符,它告诉 JavaScript 引擎该函数包含异步操作。当你在一个函数上使用 `async` 修饰符时,你可以在该函数中使用 `await` 关键字,或者在函数体内使用 `Promise`。 例如: ```javascript async function fetchData() { return await fetch('https://api.example.com/data'); } ``` 在这个例子中,`fetchData` 是一个异步函数,它返回一个 `Promise`。这个 `Promise` 被解析为从服务器获取的数据。由于 `await` 关键字,我们不需要使用 `.then()` 或 `.catch()` 方法来处理这个返回的 `Promise`。 **await** `await` 是一个等待操作完成的表达式。当它出现在一个 `async` 函数中时,它会等待一个 `Promise` 或另一个 `await` 表达式完成。一旦这个操作完成,控制权就会立即返回给调用者。 例如: ```javascript async function fetchAndParseData() { const response = await fetch('https://api.example.com/data'); const data = await parseData(response); console.log(data); } ``` 在这个例子中,我们首先使用 `await` 等待 `fetch` 操作完成,然后再等待 `parseData` 函数解析数据。由于 `await` 的存在,我们不需要使用 `.then()` 或 `.catch()` 方法来处理返回的响应或解析后的数据。 注意:在 JavaScript 中使用 `await` 时,必须确保它在一个 `async` 函数内部,并且该函数必须返回一个 `Promise`。否则,JavaScript 引擎会抛出一个错误。 总结一下,`async` 和 `await` 的主要区别在于:使用 `async` 可以让异步操作看起来像同步操作,而使用 `await` 可以暂停代码执行并等待一个异步操作完成。这使得 JavaScript 中的异步编程变得更加简洁和易于理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值