Tag: async await

Cold Tasks和TaskExtensions.Unwrap

我有一个缓存类,它使用冷(未启动)任务来避免多次运行昂贵的东西。 public class AsyncConcurrentDictionary : System.Collections.Concurrent.ConcurrentDictionary<TKey, Task> { internal Task GetOrAddAsync(TKey key, Task newTask) { var cachedTask = base.GetOrAdd(key, newTask); if (cachedTask == newTask && cachedTask.Status == TaskStatus.Created) // We won! our task is now the cached task, so run it cachedTask.Start(); return cachedTask; } } 这很有效,直到你的任务实际使用C#5的await ,ala实现 cache.GetOrAddAsync(“key”, new Task(async () => { var […]

异步unit testing中的Stubbing Task返回方法

假设我有以下类和它依赖的接口: public class MyController { private IRepository _repository; public MyController(IRepository repository) { _repository = repository; } public async Task MethodUnderTest(int someId) { var o = await _repository.FindById(someId); // update o await _repository.Commit(); } } public interface IRepository { Task Commit(); } 当我对这个方法进行unit testing时,我可以执行以下操作(使用xUnit和Rhino Mocks): [Fact] public async Task MyTest() { IRepository repositoryStub = MockRepository.GenerateStub(); MyController […]

如何在使用HttpClient.GetAsync()时确定404响应状态

我试图确定HttpClient的GetAsync方法在使用C#和.NET 4.5的404错误的情况下返回的response 。 目前我只能说出错误已经发生而不是错误的状态,如404或超时。 目前我的代码我的代码如下所示: static void Main(string[] args) { dotest(“http://error.123”); Console.ReadLine(); } static async void dotest(string url) { HttpClient client = new HttpClient(); HttpResponseMessage response = new HttpResponseMessage(); try { response = await client.GetAsync(url); if (response.IsSuccessStatusCode) { Console.WriteLine(response.StatusCode.ToString()); } else { // problems handling here string msg = response.IsSuccessStatusCode.ToString(); throw new Exception(msg); } } […]

unit testing资源管理器不显示城域应用程序的异步unit testing

不确定这是一个已知问题。 我正在使用VS2012 RC(Ultimate)和Win8 Release Preview。 我创建了一个unit testing库(metro style app),并编写了一个unit testing,其中包括async / await关键字。 但是,当我编译unit testing项目时,unit testing资源管理器不会显示我写的测试。 如果我排除了async / await关键字,那么unit testing资源管理器会出现在我刚写的测试中。 有没有人以前遇到过这个,还是仅仅是我? [TestClass] public class UnitTest1 { [TestMethod] public async void SomeAsyncTest() { var result = await StorageFile.GetFileFromPathAsync(“some file path”); } }

构造函数中的WinRT异步数据加载

我想在ViewModel的构造函数中加载一些数据,但由于WinRT的异步性质,我不得不使用异步方法。 不幸的是我不能有异步构造函数所以我试图将异步方法用作同步方法。 我确信有一种更好的方法可以在应用程序加载时加载数据(异步),但我现在的想法是空白。 我正在寻找一种方法来修复我的应用程序使用我想要的思路,或者使用更合适的方法永久修复它。 代码非常简单(甚至缺少ViewModel)只是为了演示我面临的问题。 public sealed partial class MainPage : Page { public string Data { get; set; } public DataService _dataService { get; set; } public MainPage() { this.InitializeComponent(); _dataService = new DataService(); var t = _dataService.GetData(); Data = t.Result; } /// /// Invoked when this page is about to be displayed in […]

C#Concurrency – 长期运行任务的首选方法

当需要在整个应用程序生命周期中运行I / O侦听器时,在4.5框架上运行C#5.0时,首选哪种并发模型? 我已经确定了生产者 – 消费者模式最适合处理我收到的内容,但基础设施应该支持它的想法? 是否建议使用简单的Thread thread = new Thread(ThreadStart(method)) ? 或者首选的是Task或Async/Await模型? 这是一个快速解决问题,但由于我在设计初期,我更愿意确保基础强大。 我对其他语言的直觉反应是,在后台运行一个简单的线程是最好的,但C#中过多的并行框架让我偏离了正轨。 如果有任何相关性,我的应用程序中的轮询时间将由I / O读取超时处理。 更新: I / OI指的是FTDI设备,其中字节可以随时由设备推送到PC,具体取决于板载控制器的状态。 因此,我总是需要准备好拾取数据并进行处理。 我正在使用的API基于FTDI供应商提供的D2XX DLL。

C#中的Agent / MailboxProcessor使用新的async / await

这个问题结合了我不完全理解的两个主题 通过阅读关于F#中的异步的文章 ,我遇到了Agent / MailboxProcessors的主题,它可用于实现被动状态机。 是否可以使用C#5中的新异步/等待function来实现C#中类似的function,或者是否已经存在更适合的类似模拟?

如何序列化async / await?

让我们假设我有这个简单的片段: async void button_Click(object sender, RoutedEventArgs e) { await Task.Factory.StartNew(() => { Console.WriteLine(“start”); Thread.Sleep(5000); Console.WriteLine(“end”); }); } 显然,每次按下该按钮,即使前一个任务仍在运行,也会启动一个新任务。 在所有先前的任务完成之前,我将如何推迟任何新任务? 更多细节: 在上面的示例中,每个新任务都与之前的任务相同。 但是,在原始上下文中,任务序列很重要:参数可能会发生变化(我可以通过使用DateTime.Now.Ticks来“模拟”它)。 任务应按照“注册”的顺序执行。 具体来说,我的程序将与串行设备通信。 我之前使用BlockingCollection的后台线程完成了这个。 但是,这次有一个严格的请求/响应协议,如果有可能,我想使用async / await。 可能的方法: 我可以想象创建任务并将它们存储在列表中。 但是,我如何执行与要求相关的任务? 或者我应该回到之前使用的基于线程的解决方案?

CancellationToken.ThrowIfCancellationRequested后出现故障与已取消的任务状态

通常我不回答问题,但这次我想引起一些关注,我认为这可能是一个模糊而又常见的问题。 它是由这个问题触发的,从那时起我查看了我自己的旧代码,发现其中一些也受到了影响。 下面的代码启动并等待两个任务, task1和task2 ,几乎完全相同。 task1与task2不同之处在于它运行永无止境的循环。 对于执行CPU限制工作的一些现实场景,这两种情况都非常典型。 using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication { public class Program { static async Task TestAsync() { var ct = new CancellationTokenSource(millisecondsDelay: 1000); var token = ct.Token; // start task1 var task1 = Task.Run(() => { for (var i = 0; ; i++) { Thread.Sleep(i); // simulate […]

当你可以在lambda中使用await时,为什么不能在lambda中使用yield?

根据Eric Lippert的说法,匿名迭代器没有添加到该语言中,因为实现它会过于复杂。 这对我来说没问题,在他们继续实施匿名异步方法之前,它并没有打扰我。 编译器必须为异步方法做同样的事情,因为它必须用于迭代器(将它们转换为状态机),所以我很困惑为什么匿名迭代器也不允许,当匿名异步方法时。 有人可以对此有所了解吗?