0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍一种基于任务的异步模式TAP

冬至配饺子 来源:希夏普 作者:吉旺 2022-08-19 11:45 次阅读

TAP 是基于任务的异步模式,在 .NET Framework 4 中引入。TAP 是 APM 和 EAP,是推荐的模式模式。

异步/等待

async 和 是为异步编程的语法,方便我们在之前编写异步代码,有办法会等待,但不会阻止。

public async Task DoSomethingAsync()
{
// For this example, we`re just going to (aynchronously) wait 100ms.
await Task.Delay(100);
}

对于调用的方法,等一个方法结束后会显示,等今天今天继续执行显示代码。、

等待的

await 就像是一元操作符,接收一个参数 - awaitable。Task 和 Task 都是这样的类型。

public async Task NewStuffAsync()
{
// Use await and have fun with the new stuff.
await ...
}
public Task MyOldTaskParallelLibraryCode()
{
// Note that this is not an async method, so we can`t use await in here.
...
}
public async Task ComposeAsync()
{
// We can await Tasks, regardless of where they come from.
await NewStuffAsync();
await MyOldTaskParallelLibraryCode();
}
Task.Yield()
await Task.Yield() 异步强制完成方法,可以来让我们的异步方法执行。 Yield() ,让其他调度需要的任务,随后完成该任务更替。

static async Task Process()
{
await Task.Yield();

var tcs = new TaskCompletionSource();

Task.Run(() =>
{
Thread.Sleep(1000);
tcs.SetResult(true);
});

tcs.Task.Wait();
}

我不着急,我到后面再去其他任务去,你先去处理吧。其实是利用等待线程的切换。

任务.配置等待

在这种情况下,某种方法结束后可以继续执行当前的回复任务。

await someTask.ConfigureAwait(continueOnCapturedContext:false);
CancellationTokenSource
从 .NET Framework 4 开始,TAP 方法支持取消操作。

var cts = new CancellationTokenSource();
string result = await DownloadStringTaskAsync(url, cts.Token);
… // at some point later, potentially on another thread
cts.Cancel();

// 取消多个异步调用
var cts = new CancellationTokenSource();
IList results = await Task.WhenAll(from url in urls select DownloadStringTaskAsync(url, cts.Token));
// at some point later, potentially on another thread

cts.Cancel();

进步

通过进度可以远程监控方法的执行。

private async void btnDownload_Click(object sender, RoutedEventArgs e)
{
btnDownload.IsEnabled = false;
try
{
txtResult.Text = await DownloadStringTaskAsync(txtUrl.Text,
new Progress(p => pbDownloadProgress.Value = p));
}
finally { btnDownload.IsEnabled = true; }
}

任务运行

Task.Run() 可以很方便地执行任务。

public async void button1_Click(object sender, EventArgs e)
{
// 默认恢复上下文
textBox1.Text = await Task.Run(() =>
{
// … do compute-bound work here
return answer;
});
}

public async void button1_Click(object sender, EventArgs e)
{
// 内部使用 await
pictureBox1.Image = await Task.Run(async() =>
{
using(Bitmap bmp1 = await DownloadFirstImageAsync())
using(Bitmap bmp2 = await DownloadSecondImageAsync())
return Mashup(bmp1, bmp2);
});
}
任务.FromResult
Task.FromResult 使用创建一个带返回值的,已完成的任务。

public Task GetValueAsync(string key)
{
int cachedValue;
return TryGetCachedValue(out cachedValue) ?
Task.FromResult(cachedValue) : // 如果本地有缓存,直接以同步的方式获取(但返回的是异步结果)
GetValueAsyncInternal(); // 如果本地没有key对应的缓存,则异步从远端获取
}
// 异步方法从远端获取缓存
private async Task GetValueAsyncInternal(string key)
{

}

任务.WhenAll

完成异步 异步操作的。

Task [] asyncOps = (from addr in addrs select SendMailAsync(addr)).ToArray();
try
{
await Task.WhenAll(asyncOps);
}
catch(Exception exc)
{
foreach(Task faulted in asyncOps.Where(t => t.IsFaulted))
{
… // work with faulted and faulted.Exception
}
}

Task.WhenAny

一次异步操作中,第一个异步操作完成时返回。

1. 可以同时进行多个相同的异步操作,同时进行选择完成的那个

// 从多个行情源处获取行情,使用最快的那个
var cts = new CancellationTokenSource();
var recommendations = new List>()
{
GetBuyRecommendation1Async(symbol, cts.Token),
GetBuyRecommendation2Async(symbol, cts.Token),
GetBuyRecommendation3Async(symbol, cts.Token)
};

Task recommendation = await Task.WhenAny(recommendations);
cts.Cancel(); // 取消剩余任务
if (await recommendation) BuyStock(symbol);
1.多个任务交叉进行(每完成一个就处理一个)

List> imageTasks =
(from imageUrl in urls select GetBitmapAsync(imageUrl)
.ContinueWith(t => ConvertImage(t.Result)).ToList();
while(imageTasks.Count > 0)
{
try
{
Task imageTask = await Task.WhenAny(imageTasks);
imageTasks.Remove(imageTask);

Bitmap image = await imageTask;
panel.AddImage(image);
}
catch{}
}

任务延迟

在任意方法中确定任务。可以和 Task.WhenAny ,Task.WhenAll 结合使用以暂态调用处理。

public async void btnDownload_Click(object sender, EventArgs e)
{
btnDownload.Enabled = false;
try
{
Task download = GetBitmapAsync(url);
if (download == await Task.WhenAny(download, Task.Delay(3000)))
{
Bitmap bmp = await download;
pictureBox.Image = bmp;
status.Text = "Downloaded";
}
else
{
pictureBox.Image = null;
status.Text = "Timed out";
var ignored = download.ContinueWith(
t => Trace("Task finally completed"));
}
}
finally { btnDownload.Enabled = true; }
}



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • .NET
    +关注

    关注

    0

    文章

    46

    浏览量

    24282
  • APM
    APM
    +关注

    关注

    0

    文章

    69

    浏览量

    12861
  • tap
    tap
    +关注

    关注

    0

    文章

    7

    浏览量

    2541
收藏 人收藏

    评论

    相关推荐

    Spring Boot如何实现异步任务

    Spring Boot 提供了多种方式来实现异步任务,这里介绍三种主要实现方式。 1、基于注解 @Async @Async 注解是 Spring 提供的一种轻量级
    的头像 发表于 09-30 10:32 488次阅读

    在DSP平台下对多路交流信号采样时采用的一种异步采样方法介绍

    本文介绍一种在DSP平台下对多路交流信号采样时采用的一种异步采样方法。
    发表于 04-02 07:01

    介绍一种基于Internet的测控系统

    介绍一种基于Internet的测控系统
    发表于 05-26 06:50

    请问怎样去设计一种异步FIFO?

    为什么要设计一种异步FIFO?异步FIFO的设计原理是什么?怎样去设计一种异步FIFO?
    发表于 06-18 09:20

    怎样去设计一种基于Matlab的双馈异步风力发电机?

    双馈异步风力发电机是什么?怎样去设计一种基于Matlab的双馈异步风力发电机? 如何对双馈异步风力发电机进行仿真?
    发表于 07-06 06:49

    介绍一种基于matlab/simulink的异步电动机仿真模型

    本文从异步电动机的数学模型着手介绍一种基于matlab/simulink的异步电动机仿真模型,使用时只需要输入不同的电机参数即可。在此基础上设计
    发表于 09-06 06:42

    异步的功能介绍

    promises-based flow-control abstraction utility. 这是个由多个部分组成的博客系列文章,重点介绍异步的功能, 异步
    发表于 09-06 09:23

    STM32的三boot模式介绍

    浅识STM32的三boot模式文章目录浅识STM32的三boot模式任务摘要、认识boot
    发表于 12-10 07:46

    介绍一种按键检测电路

    介绍一种按键检测电路
    发表于 01-18 07:41

    介绍一种嵌入式裸机多任务切换方法

    一种嵌入式裸机多任务切换方法有时候为了实现些简单的、对实时性要求不高的任务,采用操作系统不仅增加了程序的复杂性,对低性能单片机的资源占用也是值得考虑的问题。这时候操作系统可能不是必要
    发表于 02-28 13:27

    介绍三星MCU的一种启动方式

    这是三星MCU的一种启动方式,s3c2440的MMU有一种“steppingstone”.技术,它是协助MCU从无法执行程序的NAND FLASH执行启动程序的一种方法。1、系统上电后,首先自动判断
    发表于 04-21 09:22

    有没有一种方法可以使用codewarrior tap逐步调试固件映像?

    嗨,我使用的是基于 LS1046ARDB 的定制板,我在我的定制板中修改了几个硬件组件(例如:Phy、EEPROM 等)。有没有一种方法可以使用 codewarrior tap 逐步调试固件映像
    发表于 03-29 09:02

    异步传输模式工作原理简介

    异步传输模式工作原理简介 ATM(Asynchronous Transfer Mode)异步传输模式,是一种面向连接的快速分组交换技术,建
    发表于 04-06 16:17 4208次阅读

    Android异步任务处理

    移动护理系统开发采用异步处理的方式,可以缩短执行操作的时间,避免UI线程阻塞。笔者介绍了采用异步处理方式开发移动护理程序的方法,并以移动护理中的病人列表异步
    发表于 12-30 10:39 3612次阅读

    一文看懂异步传输模式atm的特点

    ATM是一种传输模式,在这一模式中,信息被组织成信元,因包含来自某用户信息的各个信元不需要周期性出现,这种传输模式异步的。本文首先阐述了A
    发表于 03-02 13:49 8365次阅读
    一文看懂<b class='flag-5'>异步</b>传输<b class='flag-5'>模式</b>atm的特点