Tag: asynchronous

如何并行正确运行多个异步任务?

如果您需要并行运行多个异步I / O任务但需要确保不会同时运行多个XI / O进程,该怎么办? I / O处理前后的任务不应该有这样的限制。 这是一个场景 – 假设有1000个任务; 每个人都接受一个文本字符串作为输入参数; 转换该文本(预I / O处理)然后将转换后的文本写入文件。 目标是使预处理逻辑利用100%的CPU /内核和任务的I / O部分以最大10度的并行性运行(同时打开最多10个用于一次写入文件)。 你能提供一个示例代码如何使用C#/ .NET 4.5吗? http://blogs.msdn.com/b/csharpfaq/archive/2012/01/23/using-async-for-file-access-alan-berman.aspx

IHttpActionResult vs async Task

我见过的大多数Web API 2.0方法返回IHttpActionResult ,它定义为“定义异步创建System.Net.Http.HttpResponseMessage的命令”的接口。 当方法返回async Task时,我有点困惑。 你为什么要用另一个呢? 或者这些function是否完全相同 – IHttpActionResult不是已异步的吗?

不使用异步方法更新Struct的私有字段值

我刚刚在结构中使用异步方法遇到了一个奇怪的行为。 有人可以解释为什么会发生这种情况,最重要的是如果有解决方法吗? 这是一个简单的测试结构,仅仅是为了演示问题 public struct Structure { private int _Value; public Structure(int iValue) { _Value = iValue; } public void Change(int iValue) { _Value = iValue; } public async Task ChangeAsync(int iValue) { await Task.Delay(1); _Value = iValue; } } 现在,让我们使用该结构并执行以下调用 var sInstance = new Structure(25); sInstance.Change(35); await sInstance.ChangeAsync(45); 第一行实例化结构, sInstance._Value值为25 。 第二行更新sInstance._Value值,它变为35 。 现在第三行没有做任何事情,但我希望它将sInstance._Value值更新为45但是sInstance._Value保持35 […]

异步库最佳实践:ConfigureAwait(false)与设置同步上下文

众所周知,在通用库中,应在每次await调用时使用ConfigureAwait(false)以避免继续当前的SynchronizationContext。 作为使用ConfigureAwait(false)来编写整个代码库的替代方法,可以在公共表面方法中将SynchronizationContext设置为null一次,并在返回给用户之前将其恢复。 换一种说法: public async Task SomeSurfaceMethod() { var callerSyncCtx = SynchronizationContext.Current; SynchronizationContext.SetSynchronizationContext(null); try { // Do work } finally { SynchronizationContext.SetSynchronizationContext(callerSyncCtx); } } 这也可以包含在using以获得更好的可读性。 这种方法是否有缺点,它最终不会产生相同的效果吗? 主要优点显然是可读性 – 删除所有ConfigureAwait(false)调用。 它还可以降低在某处忘记ConfigureAwait(false)的可能性(虽然分析器可以减轻这种情况,但可以说开发人员也可以忘记更改SynchronizationContext)。 一个有点奇特的优点是没有嵌入在所有方法中捕获SynchronizationContext的选择。 换句话说,在一种情况下,我可能想要使用SynchronizationContext运行方法X,而在另一种情况下,我可能希望在没有一个的情况下运行相同的方法。 当ConfigureAwait(false)嵌入到无法实现的任何地方时。 当然,这是一个非常罕见的要求,但我在处理Npgsql时遇到了这个问题(触发了这个问题)。

等待/异步与“经典”异步(回调)

所以新的异步CTP非常酷; 它使我的生活变得更加容易,不必编写命名的回调方法,并使方法的意图更加清晰。 现在我已经开始玩了一下,我想知道async / await和“经典”异步回调语法之间可能存在什么差异。 这里有一些我想到的问题,但是还有很多其他我现在都不会想到的,可能会在以后。 是否有人提供优于另一个的优越表现? 一个比另一个更大的开销是否存在? 哪个在高性能环境中使用会更好?

C#async / await有/无等待(火灾和忘记)

我有以下代码: static async Task Callee() { await Task.Delay(1000); } static async Task Caller() { Callee(); // #1 fire and forget await Callee(); // #2 >1s Task.Run(() => Callee()); // #3 fire and forget await Task.Run(() => Callee()); // #4 >1s Task.Run(async () => await Callee()); // #5 fire and forget await Task.Run(async () => await […]

有关异步编程与异步和等待的问题c#

我正在学习如何使用Async和Await c#。 所以我有一个链接http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx#BKMK_WhatHappensUnderstandinganAsyncMethod 从这里我尝试从VS2012 IDE运行代码,但收到错误。 此function引发错误。 private void button1_Click(object sender, EventArgs e) { int contentLength = await AccessTheWebAsync(); label1.Text= String.Format(“\r\nLength of the downloaded string: {0}.\r\n”, contentLength); } 此行给出错误await AccessTheWebAsync(); ‘await’运算符只能在异步方法中使用。 考虑使用’async’修饰符标记此方法并将其返回类型更改为’Task’ 我做错了什么。 请指导我如何运行代码。 谢谢

如何使用CancellationToken安全地取消任务并等待Task.WhenAll

我有一个框架,它创建一个CancellationTokenSource,配置CancelAfter,然后调用异步方法并传递令牌。 然后异步方法产生许多任务,将取消令牌传递给每个任务,然后等待任务集合。 这些任务都包含通过轮询IsCancellationRequested来优雅取消的逻辑。 我的问题是,如果我将CancellationToken传递给Task.Run(),则抛出包含TaskCanceledException的AggregateException。 这可以防止任务正常取消。 为了解决这个问题,我无法将CancelationToken传递给Task.Run,​​但是我不确定我会丢失什么。 例如,我喜欢这样的想法,即如果我的任务挂起并且无法执行优雅取消,则此exception将强制关闭。 我以为我可以用两个CancelationTokens来处理这个问题,一个’优雅’而另一个’powershell’。 但是,我不喜欢这个解决方案。 这是一些psudo代码代表我上面描述的.. public async Task Main() { CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(30000); await this.Run(cts.Token); } public async Task Run(CancellationToken cancelationToken) { HashSet tasks = new HashSet(); foreach (var work in this.GetWorkNotPictured) { // Here is where I could pass the Token, // however If I do […]

转换方法以使用异步

我正在转换身份validation过程以支持异步,VS 2015 IDE警告我以下消息: async方法缺少’await’运算符并将同步运行…等… 无论如何,代码连接到LDAP商店并validation用户的帐户等…我已经尝试了各种各样的东西等待,但我只是在这里遗漏了一些东西。 我把代码恢复到以前的状态..我将非常感谢能够正确支持异步的任何指导… 这是代码: public async Task GetAsyncADUser(PrincipalContextParameter param) { try { if (UseLDAPForIdentityServer3) { using (var pc = new PrincipalContext(ContextType.Domain, param.ADDomain, param.ADServerContainer, param.ADServerUser, param.ADServerUserPwd)) { UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(pc, param.UserNameToValidate); if (userPrincipal != null) { bool isvalid = pc.ValidateCredentials(userPrincipal.DistinguishedName, param.UserPasswordToValidate, ContextOptions.SimpleBind); if (isvalid) { User user = new User { ad_guid […]

使用.Result的异步方法

以下方法循环遍历postdata列表以对令牌发出多个请求,例如,每个请求都使用特定的clientID。 我的问题与异步有关。 我试图让令牌的调用是异步的。 使用.Result是否必然使方法同步? public async Task ReturnDataFromUrl1(List<List<KeyValuePair>> listOfPostData) { List<Task> taskList = new List<Task>(); string allTokens = “”; List<Task> downloadTasks = new List<Task>(); foreach (var postData in listOfPostData) { using (var client = new HttpClient()) { client.BaseAddress = new Uri(“http://localhost:23081”); HttpContent httpContent = new FormUrlEncodedContent(postData); HttpResponseMessage response = client.PostAsync(“/Token”, httpContent).Result; var responsecode = (int)response.StatusCode; […]