升级应用程序时,该Test-ServiceFabricApplicationPackage命令会为版本号未更改的每个代码包抛出错误(它表示内容已更改,即使代码尚未更改).我知道有一个功能允许创建部分包,但我无法使用它.我的问题是:
ServiceManifest.xml文件?)Test-ServiceFabricApplicationPackage(图像存储URL是什么?如何将该参数传递给标准部署脚本?)我很欣赏一个彻底的例子.
在下面的程序中,我希望任务能够获得GC,但事实并非如此.我已经使用了一个内存分析器,它表明CancellationTokenSource即使任务明显处于最终状态,它也会引用它.如果我删除TaskContinuationOptions.OnlyOnRanToCompletion,一切都按预期工作.
为什么会发生这种情况,我该怎么做才能阻止它呢?
static void Main()
{
var cts = new CancellationTokenSource();
var weakTask = Start(cts);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Console.WriteLine(weakTask.IsAlive); // prints True
GC.KeepAlive(cts);
}
private static WeakReference Start(CancellationTokenSource cts)
{
var task = Task.Factory.StartNew(() => { throw new Exception(); });
var cont = task.ContinueWith(t => { }, cts.Token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Default);
((IAsyncResult)cont).AsyncWaitHandle.WaitOne(); // prevents inlining of Task.Wait()
Console.WriteLine(task.Status); // Faulted
Console.WriteLine(cont.Status); // Canceled
return new WeakReference(task);
}
Run Code Online (Sandbox Code Playgroud)
我怀疑是因为延续从不运行(它不符合其选项中指定的标准),所以它永远不会从取消令牌中取消注册.因此CTS持有对延续的引用,该引用持有对第一个任务的引用.
更新
PFX团队已确认这似乎是泄漏.作为解决方法,我们在使用取消令牌时已停止使用任何延续条件.相反,我们总是执行延续,检查内部条件,OperationCanceledException如果不满足则抛出.这保留了延续的语义.以下扩展方法封装了这个:
public static Task ContinueWith(this Task …Run Code Online (Sandbox Code Playgroud) 似乎如果您将 Scale Set 的overprovision属性设置为true( https://azure.microsoft.com/en-us/documentation/articles/virtual-machine-scale-sets-design-overview/#overprovisioning ),您会得到一个无效的 SF集群(删除的不必要的虚拟机在集群中显示为坏节点)。
有没有办法让它工作?当您有多个 VM 扩展时,过度配置可以真正帮助部署成功。
azure-virtual-machine azure-service-fabric azure-vm-scale-set
我想异步执行几个任务,每个任务都会运行http请求,可以抛出异常或安全结束.我需要在第一个任务成功完成或所有任务都失败时完成.请指教.