我正在尝试定义一个函数,factorize,它使用类似于Seq.sum的结构类型约束(需要静态成员Zero,One,+和/),以便它可以与int,long,bigint等一起使用.I似乎无法获得正确的语法,并且无法在该主题上找到很多资源.这就是我所拥有的,请帮助.
let inline factorize (n:^NUM) =
^NUM : (static member get_Zero: unit->(^NUM))
^NUM : (static member get_One: unit->(^NUM))
let rec factorize (n:^NUM) (j:^NUM) (flist: ^NUM list) =
if n = ^NUM.One then flist
elif n % j = ^NUM.Zero then factorize (n/j) (^NUM.One + ^NUM.One) (j::flist)
else factorize n (j + ^NUM.One) (flist)
factorize n (^NUM.One + ^NUM.One) []
Run Code Online (Sandbox Code Playgroud) 我想在捕获异常后再次执行try块中的代码.这有可能吗?
对于Eg:
try
{
//execute some code
}
catch(Exception e)
{
}
Run Code Online (Sandbox Code Playgroud)
如果异常被捕获,我想再次进入try块以"执行一些代码"并再次尝试执行它.
我需要一个用于我们的.net应用程序的嵌入式数据库.
这个数据库应该支持sql(与Berkley不同).
任何人都可以建议任何选择
StyleCop规则SA1600要求每个类型成员都有自己的文档头.我认为这很合理,我喜欢这条规则.但是假设我们有以下层次结构:
/// <summary>
/// Documentation for interface ISomeModule.
/// </summary>
interface ISomeModule
{
/// <summary>
/// Documentation for DoA.
/// </summary>
void DoA();
/// <summary>
/// Documentation for DoB.
/// </summary>
void DoB();
}
/// <summary>
/// Documentation for StandardModule.
/// </summary>
class StandardModule : ISomeModule
{
private readonly SomeCoolType _value;
/// <summary>
/// Documentation for constructor.
/// </summary>
public StandardModule(SomeCoolType value)
{
_value = value;
}
// SA1600 violation here!
public void DoA()
{
// realisation of DoA().
} …Run Code Online (Sandbox Code Playgroud) 请原谅粗略的代码,我试图以秒为单位显示视频的持续时间.我有一个下面但它没有正常工作.
我希望它能很好地显示 - 即应该显示9m:59s而不是09m:59s.
如果小时为零则不显示小时数,如果小时数为零则不显示分钟数.
public static string GetTimeSpan(int secs)
{
TimeSpan t = TimeSpan.FromSeconds(secs);
string answer;
if (secs < 60)
{
answer = string.Format("{0:D2}s", t.Seconds);
}
else if (secs < 600)//tenmins
{
answer = string.Format("{0:m}m:{1:D2}s", t.Minutes, t.Seconds);
}
else if (secs < 3600)//hour
{
answer = string.Format("{0:mm}m:{1:D2}s", t.Minutes, t.Seconds);
}
else
{
answer = string.Format("{0:h}h:{1:D2}m:{2:D2}s",
t.Hours,
t.Minutes,
t.Seconds);
}
return answer;
}
Run Code Online (Sandbox Code Playgroud) 看着:
member this.PostAndReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> 'Reply
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么签名看起来对我来说非常直观.我们想要做的是向代理发布消息,然后等待回复.为什么我们必须给他一个奇怪的功能作为'信息'?
再次看到这个MSDN片段:
let rec loop() =
printf "> "
let input = Console.ReadLine()
printThreadId("Console loop")
let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
if (reply <> "Stopping.") then
printfn "Reply: %s" reply
loop()
else
()
loop()
Run Code Online (Sandbox Code Playgroud)
我更喜欢这样的东西:
member this.PostAndReply : 'Msg * ?int -> 'Reply
Run Code Online (Sandbox Code Playgroud)
谢谢
我在现有组中创建新计数器时遇到一个奇怪的问题.我有一个Windows服务,它做了一些工作,并允许我通过性能计数器监视其状态.我有性能计数器组和一些性能计数器.在服务安装阶段(具有管理员权限)创建组,并在服务启动时初始化计数器(作为LocalSystem用户).一切正常,组存在,计数器也存在,我可以监视它们并写入性能计数器日志.服务不断运行.
然后我想添加一些性能计数器.我将它们添加到服务代码中,通过卸载以前的服务实例(卸载代码删除性能计数器组)重新生成并部署到服务器,然后再次安装服务(在安装阶段使用所有新计数器创建性能计数器组).然后我开始服务.
这是故事中常见,无趣的部分的结束.奇怪的事情从这里开始.
我转到PerMon,将所有计数器添加到系统监视器视图.我可以看到我的性能计数器组,我看到所有性能计数器,包括我刚刚添加的新性能计数器.我可以将它们添加到系统监视器视图.我可以看到,旧的计数器正在工作.但新计数器不起作用,它们不收集任何数据.好吧,好吧,也许是我的错误,我切换到日志视图并尝试记录性能计数器数据.旧计数器在记录之前记录.但是当我尝试添加新计数器时,我在事件查看器中发现以下警告:
该服务无法将计数器'\ AGENT\MyCountersGroupName\MyNewCounter'添加到NewCountersLog日志或警报.此日志或警报将继续,但不会收集该计数器的数据.返回的错误是:找不到指定的计数器.
我试图重新安装服务,删除旧计数器,再次添加它们,没有任何改变.旧计数器正在工作,新计数器不起作用.然后我重新启动Windows,新的计数器开始工作!服务没有任何改变,我刚刚重启了服务器.我在2台服务器上遇到此问题,两者都在Windows Server 2003 SP1下运行.所有性能计数器的代码都是相同的,因为我使用泛型代码创建它们.
您可以说"嘿,不要打扰,每当您需要添加新的性能计数器时重新启动Windows",但我不能.我的服务与其他服务一起在服务器上运行,我们需要这些服务不断工作,每次更改一项服务时都无法重启服务器.
任何人都可以帮助解决这个问题吗?
更新: 看起来有类似的问题:https://stackoverflow.com/questions/2180005/adding-performance-counters-to-existing-category
更新 我不认为问题出在我的代码中,但如果有帮助我在这里发布.
安装和卸载代码(在安装阶段调用): PerformanceCountersManagerBase.GetCreationData()是一个通用的包装器,用于获取数据集合以创建性能计数器.
public static void Install()
{
CounterCreationDataCollection counters = new CounterCreationDataCollection(
PerformanceCountersManagerBase.GetCreationData<TManager>().ToArray());
if (PerformanceCounterCategory.Exists(PerformanceCountersManagerBase.GroupName))
PerformanceCounterCategory.Delete(PerformanceCountersManagerBase.
PerformanceCounterCategory.Create(PerformanceCountersManagerBase.GroupName,
"Group description",
PerformanceCounterCategoryType.SingleInstance, counters);
}
public static void Uninstall()
{
if (!PerformanceCounterCategory.Exists(PerformanceCountersManagerBase.GroupName))
return;
PerformanceCounterCategory.Delete(PerformanceCountersManagerBase.GroupName);
}
Run Code Online (Sandbox Code Playgroud)
用于初始化服务和更新中的计数器的代码:
internal void Initialize(string name, string groupName)
{
_counter = new PerformanceCounter(groupName, name, false);
_counter.RawValue = 0;
}
internal void Increment()
{
if ((_counter == null) || _counter.ReadOnly)
return; …Run Code Online (Sandbox Code Playgroud) 我正在为Web服务开发WIX 3.6安装程序.但是当我尝试使用HeatDirectory来获取所有必要的输出时,我遇到了一个问题,无论我尝试什么,我都会为每个收获的文件收到以下错误:
系统找不到文件'SourceDir\Some.dll ...'
错误发生在WcfService.wxs中; 奇怪的是,WcfService.wxs是由我的项目文件(下面)中的heatdirectory部分自动创建的. 如果它必须知道它们在哪里创建WcfService.wxs,它怎么会爆炸说它找不到这些.dll? 当我从我读过的任何一个教程中下载并构建一个WIX示例项目(原样)时,甚至会出现这些错误.
目标:尽可能多地自动化.dll包含(即利用收获来处理依赖项目等)
我正在运行Win 7 64位,项目是.NET 4.
Product.wxs:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="CompleteInstall" Language="1033" Version="1.0.0.0" Manufacturer="Technologies" UpgradeCode="b2ae6aa5-263f-4f9a-a250-8599a7f2cb03">
<Package InstallerVersion="200" Compressed="yes" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="CommonDir1" Name="Common Directory 1">
<Directory Id="CommonDir2" Name="Common Directory 2">
<Directory Id="INSTALLFOLDER" Name="Install Directory"/>
</Directory>
</Directory>
</Directory>
</Directory>
<Feature Id="ProductFeature" Title="CompleteInstall" Level="1">
<ComponentGroupRef Id="WcfService_Project" />
</Feature>
<Property Id="WIXUI_INSTALLDIR">INSTALLFOLDER</Property>
<UIRef Id="WixUI_InstallDir" />
</Product> …Run Code Online (Sandbox Code Playgroud) 我想从我的库类中引发一系列事件,但我担心一些事件订阅者会很粗鲁并且需要很长时间来处理一些事件,从而阻止了引发事件的线程.我以为我可以通过使用线程池线程来提升每个事件来保护提升线程:
if (packet != null && DataPacketReceived != null)
{
var args = new DataPacketEventArgs(packet);
DataPacketReceived.BeginInvoke(this, args, null, null);
}
Run Code Online (Sandbox Code Playgroud)
当事件只有一个订阅者时,这很好,但是一旦第二个订阅者到达,DataPacketReceived就会成为多播委托,并且我得到一个参数异常,并显示错误消息"委托必须只有一个目标".是否有一种简单的方法可以在单独的线程上引发事件,或者我是否必须启动一个线程然后从那里引发事件?