Tag: 异步

在Windows Phone 7的MVVM应用程序中使用REST Web服务的良好架构?

我在确定从Web服务到UI获取数据的最佳方法时遇到了一些麻烦。 鉴于WebClient的异步性质,您将如何构建它? Model使用WebClient与webservice通信 ViewModel向模型询问数据 View是数据绑定到ViewModel 在Async完成事件中,我需要将数据从模型中取回ViewModel,这些是我想到的。 我可以在模型中触发ViewModel订阅的事件。 我或许可以做一些传递回调的事情? 或者我应该在ViewModel和Model之间进行第二级的INotifyPropertyChanged事件? 或者我非常困惑并完全误解MVVM?

TaskCompletionSource抛出“尝试将任务转换为已完成的最终状态”

我想使用TaskCompletionSource来包装MyService这是一个简单的服务: public static Task ProcessAsync(MyService service, int parameter) { var tcs = new TaskCompletionSource(); //Every time ProccessAsync is called this assigns to Completed! service.Completed += (sender, e)=>{ tcs.SetResult(e.Result); }; service.RunAsync(parameter); return tcs.Task; } 这段代码第一次运行良好。 但是第二次调用ProcessAsync只需再次分配Completed的事件处理程序(每次都使用相同的service变量),因此它将执行两次! 并且第二次抛出此exception: 在已经完成时尝试转换任务最终状态 我不确定,我应该将tcs声明为类级变量,如下所示: TaskCompletionSource tcs; public static Task ProccessAsync(MyService service, int parameter) { tcs = new TaskCompletionSource(); service.Completed -= completedHandler; […]

Async / Await VS Task.Run:何时使用? 如何使用?

好吧,我希望我得到了async / await的基础知识,但仍有一些问题在脑海中挥之不去。 但现在我正在谈论的问题。 假设在这个简单的例子中 static void Main(string[] args) { Method(); Console.WriteLine(“Main Thread”); Console.ReadLine(); } public async static void Method() { await Task.Run(new Action(LongTask)); Console.WriteLine(“New Thread”); } public static void LongTask() { Thread.Sleep(8000); Console.WriteLine(“Long Task”); } 主线程仍然继续并在调用Method()并遇到等待8秒后打印Main Thread 。 因此,当遇到await时,Method()返回调用者,即返回到main函数,保存同步上下文并从那里继续执行。 它首先打印Main Thread 。 然后在8秒完成后, Long Task和New Thread得到打印。 这部分我得到了。 我的问题在于我的申请: public IList createCase(CreateCaseInput CreateCaseInput,SaveCaseSearchInput SaveCaseSearchInput) { […]

等待多个任务的时间是否比第一个例外更多?

今天我的同事和我讨论了如何正确处理C#5.0 async方法中的exception,我们想知道是否同时等待多个任务也会观察到运行时未解包的exception。 请考虑以下代码段: async Task ExceptionMethodAsync() { await Task.Yield(); throw new Exception(); } async Task CallingMethod() { try { var a = ExceptionMethodAsync(); var b = ExceptionMethodAsync(); await Task.WhenAll(a, b); } catch(Exception ex) { // Catches the “first” exception thrown (whatever “first” means) } } 现在第二项任务会发生什么? 两者都处于故障状态,但是现在观察到还是未观察到的第二个任务exception?

使用MOQ同步方法测试EF异步方法

我有这个方法: public async Task DeleteUserAsync(Guid userId) { using (var context = this.contextFactory.Create()) { var user = await context.Users.FirstOrDefaultAsync(x => x.Id.Equals(userId)); if (user == null) { throw new Exception(“User doesn’t exist”); } context.Users.Remove(user); await context.SaveChangesAsync(); } } 我想测试一下。 所以我创建了测试: [TestMethod] public async Task DeleteUsersSuccessfulCallTest() { // Arrange var id = Guid.NewGuid(); var user = new User() […]

BeginXXX中FromAsync的参数太多了?

我有一个带有以下签名的异步方法: IAsyncResult BeginGetMyNumber(string foo, string bar, string bat, int bam, AsyncCallback callback, object state) 我想使用Factory.FromAsync执行它,如下所示: var result = Task.Factory.FromAsync( instance.BeginGetMyNumber, instance.EndGetMyNumber, “foo”, “bar”, “bat”, 100, /*bam*/ null); 但是我收到以下错误: 参数1:无法从’方法组’转换为’System.Func’ 似乎没有合适的重载FromAsync方法http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskfactory.fromasync.aspx ,它只支持最多5个参数(包括回调和状态)在BeginXXX方法上。 除了重构BeginXXX方法以获取对象而不是六个参数之外,有没有办法使用FromAsync执行它?

使用System.Net.Sockets.Socket.AcceptAsync模型时堆栈溢出

对于C#和.NET的System.Net.Sockets.Socket.AcceptAsync方法,需要处理返回值“false”以便从同步处理的连接中处理立即可用的SocketAsyncEventArgs状态。 Microsoft提供了一些示例(可在System.Net.Sockets.SocketAsyncEventArgs类页面中找到),如果存在大量挂起连接,则会导致堆栈溢出,这可以在任何实现其处理模型的系统上利用。 解决此问题的其他想法是创建一个调用处理程序方法的循环,其条件是Socket.AcceptAsync返回的值等于false,并且如果值指示则中断循环(以允许延迟处理)该操作是异步完成的(true)。 但是,此解决方案还会导致堆栈溢出漏洞,因为与传递给Socket.AcceptAsync的SocketAsyncEventArgs相关联的回调在方法结束时,调用Socket.AcceptAsync ,它也有一个立即可用的循环,同步接受,连接。 正如您所看到的,这是一个非常可靠的问题,我还没有找到一个不涉及System.Threading.ThreadPool并创建大量其他方法和调度处理的好解决方案。 据我所知,与Socket.AcceptAsync相关的异步套接字模型需要的内容多于MSDN上的示例中所示。 有没有人有一个干净有效的解决方案来处理从Socket.AcceptAsync同步接受的立即挂起的连接,而无需创建单独的线程来处理连接而不使用递归?

如果我等待已经运行或运行的任务会发生什么?

有一个Task变量,让我们说现在正在运行任务..通过执行以下行。 await _task; 我想知道当我编写这段代码时会发生什么: await _task; await _task; 它会执行两次任务吗? 或抛出exception,因为它已经运行?

异步编程设计模式

我正在研究CF.NET的一个小技术框架,我的问题是,我应该如何编写异步部分? 阅读MSDN上的很多内容,但对我来说并不清楚。 所以,这是代码: public class A { public IAsyncResult BeginExecute(AsyncCallback callback) { // What should I put here ? } public void EndExecute() { // What should I put here ? } public void Execute() { Thread.Sleep(1000 * 10); } } 如果有人可以帮助我…… 谢谢 !

将异步模型集映射到异步ViewModel集合

我正在使用一个项目,我需要使用Async编程C#。 我在Model和ViewModel之间使用Automapper进行映射。 对于异步数据,我创建了一个map方法,如下所示: public static async Task<IEnumerable> ModelToViewModelCollectionAsync(this Task<IEnumerable> persons) { return await Mapper.Map<Task<IEnumerable>, Task<IEnumerable>>(persons); } 我将此映射方法称为如下(在我的服务类中): public async Task<IEnumerable> GetAllAsync() { return await _personRepository.GetAllAsync(“DisplayAll”).ModelToViewModelCollectionAsync(); } 最后我在控制器内调用了我的服务类。 public async Task Index() { return View(await PersonFacade.GetAllAsync()); } 但是当我运行我的项目时,它会向我显示以下exception Missing type map configuration or unsupported mapping. Mapping types: Task`1 -> Task`1 System.Threading.Tasks.Task`1[[System.Collections.Generic.IEnumerable`1[[PF.Model.Person, PF.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], mscorlib, […]