Tag: 异步 等待

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) { […]

如果任务等待某事,任务状态将更改为RanToCompletion

这个问题描述了同样的问题 – MSDN Developer Forum 。 这个问题没有得到公认的答案,所给出的任何答案都不能适用于我的案例(因此是一个不同的问题)。 问题也来自我之前提出的问题 ,但是,由于性质和具体问题的不同,我问了一个新问题。 完整代码可以在这里找到: http : //pastebin.com/uhBGWC5e *唯一改变的是任务完成检查( while – > Task.WhenAll )。 等待任务内部的异步操作时,即使任务仍在运行,任务状态也会更改为RanToCompletion 。 现在,让我们看看设置: // Start async. Task t1 = Task.Factory.StartNew(Accept, s1); Task t2 = Task.Factory.StartNew(Accept, s1); Task.WhenAll(t1, t2).Wait(); Accept方法: public static async void Accept(object state) { TcpListenerEx server = (TcpListenerEx) state; IPEndPoint endPoint = server.LocalEndpoint as […]

异步方法调用和模拟

为什么模拟用户上下文仅在异步方法调用之前可用? 我编写了一些代码(实际上基于Web API)来检查模拟用户上下文的行为。 async Task Test() { var context = ((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate(); await Task.Delay(1); var name = WindowsIdentity.GetCurrent().Name; context.Dispose(); return name; } 令我惊讶的是,在这种情况下,我将收到App pool用户的名字。 代码运行的位置。 这意味着我不再拥有被模仿的用户上下文。 如果延迟更改为0,则使调用同步: async Task Test() { var context = ((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate(); await Task.Delay(0); var name = WindowsIdentity.GetCurrent().Name; context.Dispose(); return name; } 代码将返回当前模拟用户的名称。 据我所知,等待和调试器显示的内容,在分配名称之前不会调用context.Dispose()。

调用异步方法在viewmodel的构造函数中加载数据有一个警告

我的视图包含一个ListView,它显示来自互联网的一些数据,我创建了一个异步方法来加载数据并在我的viewmodel的构造函数中调用该方法。 它有一个警告提示我现在使用await关键字。 在构造函数中异步加载数据的任何其他解决方案?

编写一个等待bool的异步方法

我想编写一个await变量设置为true的方法。 这是psudo代码。 bool IsSomethingLoading = false SomeData TheData; public async Task GetTheData() { await IsSomethingLoading == true; return TheData; } TheData将由Prism事件和IsSomethingLoading变量设置。 我有一个GetTheData方法的调用,但我希望它运行异步(现在它只是在数据没有准备好时返回null。(这会导致其他问题。) 有没有办法做到这一点?

如何正确排队任务以在C#中运行

我有一个项目的枚举( RunData.Demand ),每个项目代表一些涉及通过HTTP调用API的工作。 如果我只是通过它来完成并在每次迭代期间调用API,它的工作效果很好。 但是,每次迭代需要一两秒钟,所以我想运行2-3个线程并在它们之间划分工作。 这就是我正在做的事情: ThreadPool.SetMaxThreads(2, 5); // Trying to limit the amount of threads var tasks = RunData.Demand .Select(service => Task.Run(async delegate { var availabilityResponse = await client.QueryAvailability(service); // Do some other stuff, not really important })); await Task.WhenAll(tasks); client.QueryAvailability调用基本上使用HttpClient类调用API: public async Task QueryAvailability(QueryAvailabilityMultidayRequest request) { var response = await client.PostAsJsonAsync(“api/queryavailabilitymultiday”, request); if […]

使用Async和Await的ASP.NET C#5异步Web应用程序

在研究了异步Web开发的概念之后,特别是从这个源开始,我创建了一个示例应用程序来certificate这个概念。 该解决方案由2个ASP.NET Web API应用程序组成。 第一个是模拟的慢端点; 它在返回一个名为Student的自定义类列表之前等待1000毫秒: public IEnumerable Get() { Thread.Sleep(1000); return new List { new Student { Name = @”Paul” }, new Student { Name = @”Steve” }, new Student { Name = @”Dave” }, new Student { Name = @”Sue” } }; } 这是学生class: public class Student { public string Name { get; […]

如何等待异步委托

在其中一个MVAvideo中,我看到了下一个结构: static void Main(string[] args) { Action testAction = async () => { Console.WriteLine(“In”); await Task.Delay(100); Console.WriteLine(“After first delay”); await Task.Delay(100); Console.WriteLine(“After second delay”); }; testAction.Invoke(); } 执行结果将是: In Press any key to continue . . . 它是完美的编译,但现在我没有看到任何方式等待它。 我可能会在调用后放置Thread.Sleep或Console.ReadKey ,但这不是我想要的。 那么应该如何修改这个代表以使其变得等待?(或者至少我如何跟踪执行完成?) 这些代表有实际用途吗?

async不应该用于高CPU任务吗?

我想知道async是否正确 – await不应该用于“高CPU”任务。 我在演讲中看到了这一点。 所以我猜这意味着什么 Task calculateMillionthPrimeNumber = CalculateMillionthPrimeNumberAsync(); DoIndependentWork(); int p = await calculateMillionthPrimeNumber; 我的问题是,上述情况是否合理,或者如果没有,是否还有其他一些使高CPU任务异步的例子?