TPL和PCL中的监视器

Shmuelie

因此,我正在编写一个客户端API PCL(.NET 4.5,SL 5,Win8,WP8.1,WP SL 8)库,并且我决定一次只允许一个HTTP请求。目前,我使用TPL来执行这些操作:

Task.Factory.FromAsync<Stream>(httpReq.BeginGetRequestStream, httpReq.EndGetRequestStream, null).ContinueWith<Task<WebResponse>>((requestStreamTask) =>
{
    return Task<WebResponse>.Factory.FromAsync(httpReq.BeginGetResponse, httpReq.EndGetResponse, null);
}).Unwrap().ContinueWith<HttpWebResponse>((getResponseTask) =>
    {
        return (HttpWebResponse)getResponseTask.Result;
    });

因此,我想添加锁定以防止一次发出多个请求。我知道我可以Monitor.Enter在开始之前先打电话Monitor.Exit,然后在最后一次打电话ContinueWith但是基于迁移到TPL的锁定Monitor,由于线程问题,我不能那样使用我使用该帖子建议的其他阻塞对象没有问题,但据我所知,在PCL中,我唯一可用的锁是Monitor。

所以我该怎么做?

编辑:在下面与Yuval Itzchakov交谈之后,我意识到我只有Monitor同步类的原因是因为我在PCL中具有Silverlight 5支持。如果没有其他方法,我将考虑放弃对SL5的支持,但我宁愿不这样做。

EDIT2:弄乱之后,我意识到我确实有这个ManualResetEvent课,我可以使用那个课吗?

斯蒂芬·克莱里

由于您正在编写PCL并包括一些较旧的平台(特别是SL5),因此您的选择有些局限。SL5不支持TPL Dataflow,也不是SemaphoreSlim

但是HttpClient/也是如此asyncawait这些使您的代码比Task.Factory.FromAsync+ Unwrap+干净得多ContinueWith

对于可移植async的同步和/或生产者/消费者队列,我建议使用自己的AsyncEx库在这种情况下,一个AsyncLock就足够了;它可以类似于以下方式使用SemaphoreSlim

private readonly HttpClient _client = new HttpClient();
private readonly AsyncLock _mutex = new AsyncLock();

public async Task<string> GetStringAsync(string url)
{
    using (await _mutex.LockAsync())
    {
        return await _client.GetStringAsync(url);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TPL和PCL中的监视器

来自分类Dev

Netlogo 在监视器中显示 pxcor 和/或 pycor

来自分类Dev

内部/监视器锁定和继承

来自分类Dev

内部/监视器锁定和继承

来自分类Dev

在IntelliJ中显示对象监视器

来自分类Dev

过程监视器中的托管堆栈

来自分类Dev

C#中的监视器数组

来自分类Dev

C#中的监视器数组

来自分类Dev

在XFCE中设置主监视器?

来自分类Dev

监视器不会从睡眠中回来

来自分类Dev

扩展Kubuntu中的监视器

来自分类Dev

扩展屏幕-1个VGA监视器和1个HDMI监视器

来自分类Dev

带宽监视器

来自分类Dev

带宽监视器

来自分类Dev

如何在python glfw中获取监视器的宽度和高度

来自分类Dev

在系统监视器中,杀死进程和结束进程有什么区别?

来自分类Dev

Winforms 应用程序中启动对象的多个监视器和位置

来自分类Dev

在多监视器设置中,如何识别显示winform的监视器?

来自分类Dev

在双监视器设置中,如何查找给定窗口在哪个监视器上?

来自分类Dev

Android Studio和android设备监视器

来自分类Dev

Ubuntu 20.04 Nvidia Prime on Demand和外部监视器

来自分类Dev

第二监视器和工作区

来自分类Dev

远程桌面连接和物理监视器黑屏

来自分类Dev

如何修复监视器损坏的持续线和失真?

来自分类Dev

区分内部和外部监视器

来自分类Dev

Ubuntu 12.04 和 KDE,GPU 图形温度监视器

来自分类Dev

为什么我的 CPU 利用率在硬件监视器和任务管理器中不同?

来自分类Dev

GetMonitorInfo和GetDeviceCaps中第二个监视器的宽度和高度不正确

来自分类Dev

如何使用键盘快捷键在监视器之间和监视器之间移动窗口?