gpt4 book ai didi

c# - 使用相对扩展在 linqpad 中恢复数据库时显示进度

转载 作者:太空宇宙 更新时间:2023-11-03 20:10:27 26 4
gpt4 key购买 nike

我有以下 C# 代码。

var databaseRestore = new Microsoft.SqlServer.Management.Smo.Restore();
//databaseRestore.PercentComplete += CompletionStatusInPercent;
//databaseRestore.PercentCompleteNotification = 10;
//databaseRestore.Complete += Restore_Completed;

...

var complete = Observable
.FromEventPattern(databaseRestore, "Complete")
.Select(x=>x.EventArgs as ServerMessageEventArgs)
.Select(x=>x.Error.Message)
.Take(1)
.DumpLive("Complete");

var percentComplete = Observable
.FromEventPattern(databaseRestore, "PercentComplete")
.Select(x=>x.EventArgs as PercentCompleteEventArgs)
.Select(x=>x.Percent)
.TakeUntil(complete)
.DumpLive("PercentComplete");

...

databaseRestore.SqlRestore(server);

如果我运行它,首先总是来自处理程序的输出(如果我取消注释它们)。

然后,Linqpad 首先显示“Live Observables”结果选项卡

  1. “完成”可观察,已经完成并带有最终结果消息。
  2. “PercentComplete”,仍在等待并带有“-”(还没有条目?)

我想要的只是摆脱使用响应式扩展的事件。首先应该是用实际进度更新的“PercentComplete”可观察值。然后用最后一条消息“完成”。

问题:如何正确设置可观察对象?

最佳答案

LINQPad 的 DumpLive 方法使用 WPF 呈现,因此如果主线程被阻塞,它就无法工作。

您可以改为编写您自己的 DumpLive 版本,它使用 HTML 呈现。这会比较慢(因为它必须在每次 observable 发布值时更新 HTML DOM),但无论主线程是否被阻塞,它都可以工作。

代码如下:

IDisposable DumpLatest<T> (IObservable<T> obs)
{
var dc = new DumpContainer ().Dump();
var extensionToken = Util.GetQueryLifeExtensionToken();
return obs.Subscribe (
value => dc.Content = value,
ex => { dc.Content = ex; extensionToken.Dispose(); },
() => extensionToken.Dispose());
}

如果您在我的扩展中将其定义为扩展方法,您将能够在需要时调用它。

关于c# - 使用相对扩展在 linqpad 中恢复数据库时显示进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20424433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com