Questions tagged «task-parallel-library»

自.NET 4开始,任务并行库是.NET Framework的一部分。它是一组API,使开发人员可以对异步应用程序进行编程。

4
调用ConfigureAwait获取所有服务器端代码的最佳实践
当您拥有服务器端代码(即某些代码ApiController)并且您的函数是异步的(因此它们返回)Task<SomeObject>时,是否在任何时候都等待调用的函数是否被视为最佳实践ConfigureAwait(false)? 我已经读到它具有更高的性能,因为它不必将线程上下文切换回原始线程上下文。但是,对于ASP.NET Web Api,如果您的请求是在一个线程上传入的,并且您等待某个函数并调用ConfigureAwait(false),则在返回ApiController函数的最终结果时,该函数可能会将您置于另一个线程上。 我在下面输入了一个我正在谈论的例子: public class CustomerController : ApiController { public async Task<Customer> Get(int id) { // you are on a particular thread here var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false); // now you are on a different thread! will that cause problems? return customer; } }

9
如果我的界面必须返回Task,那么执行无操作实现的最佳方法是什么?
在下面的代码中,由于接口的原因,该类LazyBar必须从其方法中返回一个任务(出于参数的考虑,不能更改)。如果LazyBars实现不寻常,因为它恰巧可以快速且同步地运行,那么从该方法返回No-Operation任务的最佳方法是什么? 我已经跟Task.Delay(0)下面,但是我想知道这是否有任何性能的副作用,如果该功能被称为很多(为了讨论各种情形,说上百次),: 这种语法糖是否会发展成大事? 它会开始阻塞我的应用程序的线程池吗? 编译器切割器是否足以应付Delay(0)不同要求? 请问return Task.Run(() => { });有什么不同? 有没有更好的办法? using System.Threading.Tasks; namespace MyAsyncTest { internal interface IFooFace { Task WillBeLongRunningAsyncInTheMajorityOfImplementations(); } /// <summary> /// An implementation, that unlike most cases, will not have a long-running /// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations' /// </summary> internal class LazyBar : IFooFace { #region …

5
对多个任务使用异步/等待
我使用的是完全异步的API客户端,也就是说,每个操作要么返回Task要么Task<T>,例如: static async Task DoSomething(int siteId, int postId, IBlogClient client) { await client.DeletePost(siteId, postId); // call API client Console.WriteLine("Deleted post {0}.", siteId); } 使用C#5 async / await运算符,启动多个任务并等待所有任务完成的正确/最有效方法是什么: int[] ids = new[] { 1, 2, 3, 4, 5 }; Parallel.ForEach(ids, i => DoSomething(1, i, blogClient).Wait()); 要么: int[] ids = new[] { …

15
异步等待Task <T>超时完成
我想等待Task &lt;T&gt;完成一些特殊规则:如果X毫秒后仍未完成,我想向用户显示一条消息。如果它在Y毫秒后仍未完成,我想自动请求cancel。 我可以使用Task.ContinueWith异步地等待任务完成(即,安排在任务完成时执行的动作),但这不允许指定超时。我可以使用Task.Wait来同步等待任务完成并超时,但这会阻塞我的线程。如何异步等待任务完成并超时?


8
任务和线程有什么区别?
在C#4.0中,我们Task在System.Threading.Tasks命名空间中。Thread和之间的真正区别是什么Task。为了我自己的学习,我做了一些示例程序(来自MSDN的帮助) Parallel.Invoke Parallel.For Parallel.ForEach 但是有很多疑问,因为这个想法不太清楚。 我最初在Stackoverflow中搜索了类似类型的问题,但可能与此问题标题有关,我无法获得相同的问题。如果有人知道先前在此处发布的相同类型的问题,请提供链接的参考。


4
如何告诉Moq返回任务?
我有一个接口声明 Task DoSomethingAsync(); 我正在使用MoqFramework进行测试: [TestMethod()] public async Task MyAsyncTest() { Mock&lt;ISomeInterface&gt; mock = new Mock&lt;ISomeInterface&gt;(); mock.Setup(arg =&gt; arg.DoSomethingAsync()).Callback(() =&gt; { &lt;my code here&gt; }); ... } 然后在测试中,我执行调用的代码await DoSomethingAsync()。测试只是失败了。我究竟做错了什么?

11
如何在不等待的情况下安全地在C#中调用异步方法
我有一个async不返回任何数据的方法: public async Task MyAsyncMethod() { // do some stuff async, don't return any data } 我从另一个返回一些数据的方法中调用此方法: public string GetStringData() { MyAsyncMethod(); // this generates a warning and swallows exceptions return "hello world"; } 在MyAsyncMethod()不等待的情况下进行调用会在Visual Studio中引发“ 由于未等待此调用,因此当前方法会在调用完成之前继续运行 ”警告。在该警告的页面上,它指出: 仅当您确定不想等待异步调用完成并且被调用的方法不会引发任何异常时,才应考虑禁止显示警告。 我确定我不想等待通话结束。我不需要或没有时间。但是通话可能会引发异常。 我已经几次遇到这个问题,并且我确定这是一个常见的问题,必须有一个通用的解决方案。 如何安全地调用异步方法而不等待结果? 更新: 对于建议我只是等待结果的人们,这是响应我们Web服务(ASP.NET Web API)上的Web请求的代码。在UI上下文中等待将保持UI线程空闲,但是在Web请求调用中等待将等待Task完成,然后再响应请求,从而无故增加了响应时间。

4
同步等待异步操作,为什么Wait()在这里冻结程序
前言:我在寻找一个解释,而不仅仅是一个解决方案。我已经知道了解决方案。 尽管花了几天时间研究有关基于任务的异步模式(TAP),异步和等待的MSDN文章,但我对某些更详细的信息仍然感到困惑。 我正在为Windows Store Apps编写记录器,并且希望同时支持异步和同步记录。异步方法遵循TAP,同步方法应隐藏所有这些内容,并且外观和工作方式与普通方法类似。 这是异步日志记录的核心方法: private async Task WriteToLogAsync(string text) { StorageFolder folder = ApplicationData.Current.LocalFolder; StorageFile file = await folder.CreateFileAsync("log.log", CreationCollisionOption.OpenIfExists); await FileIO.AppendTextAsync(file, text, Windows.Storage.Streams.UnicodeEncoding.Utf8); } 现在对应的同步方法... 版本1: private void WriteToLog(string text) { Task task = WriteToLogAsync(text); task.Wait(); } 看起来正确,但是不起作用。整个程序永久冻结。 版本2: 嗯..也许任务没有开始? private void WriteToLog(string text) { Task task …

6
捕获异步void方法引发的异常
使用Microsoft .NET的异步CTP,是否可以在调用方法中捕获由异步方法引发的异常? public async void Foo() { var x = await DoSomethingAsync(); /* Handle the result, but sometimes an exception might be thrown. For example, DoSomethingAsync gets data from the network and the data is invalid... a ProtocolException might be thrown. */ } public void DoFoo() { try { Foo(); …


8
运行多个异步任务并等待它们全部完成
我需要在控制台应用程序中运行多个异步任务,并等待它们全部完成再进行进一步处理。 那里有很多文章,但是我阅读的内容似乎越来越困惑。我已经阅读并理解了任务库的基本原理,但是显然我在某处缺少链接。 我知道可以链接任务,以便它们在另一个任务完成之后开始(这是我阅读的所有文章的场景),但是我希望所有任务同时运行,我想知道一次他们都完成了。 对于这种情况,最简单的实现是什么?

10
等待具有不同结果的多个任务
我有3个任务: private async Task&lt;Cat&gt; FeedCat() {} private async Task&lt;House&gt; SellHouse() {} private async Task&lt;Tesla&gt; BuyCar() {} 它们都需要先运行,然后我的代码才能继续,我也需要它们的结果。没有结果有什么共同点 如何调用并等待3个任务完成然后获得结果?

12
同步调用异步方法
我有一个async方法: public async Task&lt;string&gt; GenerateCodeAsync() { string code = await GenerateCodeService.GenerateCodeAsync(); return code; } 我需要从同步方法中调用此方法。 我如何才能做到这一点而不必重复GenerateCodeAsync方法以使其同步工作? 更新资料 但找不到合理的解决方案。 但是,我看到HttpClient已经实现了这种模式 using (HttpClient client = new HttpClient()) { // async HttpResponseMessage responseAsync = await client.GetAsync(url); // sync HttpResponseMessage responseSync = client.GetAsync(url).Result; }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.