我正在使用TPL和async/await在我的应用程序的webclient上构建异步API.很少有地方(通常我需要运行一堆异步任务并最终等待所有这些),我正在关注代码片段.我只是想确保我正确,因为尽管使用TPL编写异步代码相对容易并且async/await 调试/故障排除仍然具有挑战性(客户站点上的交互式调试和故障排除问题) - 所以想要正确.
我的目标:能够捕获从原始任务,继续任务以及子任务生成的异常,以便我可以处理它(如果需要).我不希望任何例外都被冷杉和遗忘.
我使用的基本原理: 1.net框架确保将异常附加到任务2.可以将try/catch块应用于async/await以提供同步代码的幻觉/可读性(参考:http://channel9.msdn. com/Events/TechDays/Techdays-2014-the-Netherlands/Async-programming-deep-dive,http://blogs.msdn.com/b/ericlippert/archive/2010/11/19/asynchrony-in-c- 5-part-seven-exceptions.aspx,http://msdn.microsoft.com/en-us/library/dd537614.aspx等)
问题 我想获得批准,已经实现了期望的目标(我可以从原始,继续和子任务中捕获异常),并且我可以对样本做任何改进:
例如,是否存在其中一个组合任务(例如,未解包的代理任务)根本不会被激活(waitforactivation状态)的情况,那么waitall可能只是等待任务开始?我的理解是这些情况永远不会发生,因为延续任务总是执行,并返回由代理使用wnwrap跟踪的任务.只要我在所有层和apis中遵循类似的模式,模式应该捕获链接任务中的所有聚合异常.
注意:基本上我正在寻找建议,例如,如果原始任务状态没有运行完成,或者使用附加到父级,那么我就可以避免在继续任务中创建虚拟任务,这样我就可以只在父级等上查看所有可能性以便我可以选择最好的选择,因为这个模式非常依赖我的应用程序进行错误处理.
static void SyncAPIMethod(string[] args)
{
try
{
List<Task> composedTasks = new List<Task>();
//the underlying async method follow the same pattern
//either they chain the async tasks or, uses async/await
//wherever possible as its easy to read and write the code
var task = FooAsync();
composedTasks.Add(task);
var taskContinuation = task.ContinueWith(t =>
{
//Intentionally not using TaskContinuationOptions, so that the …Run Code Online (Sandbox Code Playgroud) EventWaitHandle可以跨进程使用。并且自动和手动重置事件仅在单个进程内。您能确认一下吗?
文档说自动/手动是本地的,并且它们不采用名称参数。所以我认为它们只适用于一个流程。顺便问一下,他们可以跨appdomain吗?
EventWaitHandle 是唯一命名的事件,或者我可以使用任何其他机制。基本上我需要使用事件,但它应该跨进程。
下面的一次性模式怎么样?
using System;
public class MyClass : IDisposable
{
public void Dispose()
// Implement IDisposable
{
//just do the cleanup
GC.SuppressFinalize(this);
}
}
Run Code Online (Sandbox Code Playgroud)
抱歉是因为气馁.我想说,如果没有未管理的资源,我需要终结器吗?上述一次性图案不够好吗?是的,即使用户/开发者没有调用dispose,默认情况下GC不会调用处理吗?
那么GC调用处理和终结器的顺序又如何呢?
请看 标准配置模式?为什么我们需要在虚拟方法中使用"disposing"参数,而不是在dipose之后调用终结器? 更多细节.
在其他我们有终结器时,为什么我们调用Dispose with false作为参数.
从http://msdn.microsoft.com/en-us/magazine/cc163392.aspx#S2看起来总是建议从终结器而不是托管引用中释放未损坏的资源.
它始终建议从Dispose方法中释放未损坏的资源......
尽管如此,仍然没有得到全面的要点并阅读文章.
using System;
public class MyClass : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool suppressFinalize)
{
if (!disposed)
{
//Just do the cleanup
//and release resources
disposed = true;
}
if (!suppressFinalize)
{
GC.SuppressFinalize(this);
}
}
public …Run Code Online (Sandbox Code Playgroud) 我有简单的HttpClient,它在使用ipv4/fqdb /主机名时非常有效(请参阅下面的代码片段).但是相同的代码不起作用,momemnt我试图使用ipv6地址连接到服务器.我可能需要更改一些配置设置并能够使用ipv6地址定义uri(我查看了msdn并且它具有以下语句 - 如果主机名是IPv6地址,则使用规范的IPv6地址 .ScopeId和其他可选的IPv6数据被删除 - http://msdn.microsoft.com/en-us/library/system.uri.aspx - 不确定它意味着什么,将试图明天解决它).
同时,任何解决问题的想法/想法/方法都非常有用:).
看起来我需要在schedred括号中保留ipv6地址[括起来'[]'] http:// [fe08 :: 83e7:71e8:1364:0dff%19]:58703 /看起来现在一切正常.感谢如何在uri中为(或没有)区域索引包含ipv6地址以进行.net远程处理?
this.Client = new HttpClient();
**//below line throws UriFormatException (Invalid URI: Invalid port specified)**
this.Client.BaseAddress = new Uri(http://fe08::83e7:71e8:1364:0dff%19:58703/);
this.Client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
//whereas below code works, when ipv4/fqdn is used...
this.Client = new HttpClient();
this.Client.BaseAddress = new Uri(10.0.0.1:58501);
this.Client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
Run Code Online (Sandbox Code Playgroud)
问候.
我在.net中实现了客户cmdlet.我想知道用户传递给它的所有参数.
My-Cmdlet -foo -bar -foobar
Run Code Online (Sandbox Code Playgroud)
基本上我想知道用户以编程方式使用参数foo,bar,foobar执行此cmdlet.
在脚本中看起来我们可以使用:$ PSBoundParameters.ContainsKey('WhatIf')
我需要.net(c#)中的那个.
c# ×5
.net ×4
asp.net ×1
asp.net-mvc ×1
async-await ×1
asynchronous ×1
c#-3.0 ×1
cmdlet ×1
cmdlets ×1
powershell ×1
vb.net ×1