小编Dan*_*ley的帖子

如何以与C#区域类似的方式组织F#代码?

是否有一个与C#区域等效的功能,可以将代码分组到命名块中并折叠和展开它们?

或者,是否有任何变通方法或第三方工具可用于实现相同的结果?

c# f# visual-studio

18
推荐指数
1
解决办法
3095
查看次数

为什么.NET异常不能用于接口而不是基类?

.Net框架try-catch实现仅允许您捕获从基类"System.Exception"继承的类型.为什么这不是"System.IException"这样的界面?

用例

我们在继承System.Exception的每个API中使用自定义基类.只有在记录异常后才会抛出此异常,因此我们可以通过以下方式轻松避免重新记录:

try
{
    // Do something.
}
catch (LoggedException)
{
    // Already logged so just rethrow.
    throw;
}
catch (Exception ex)
{
    // TODO: Log exception.
    throw new LoggedException("Failed doing something.", ex);
}
Run Code Online (Sandbox Code Playgroud)

这很棒,直到您需要一个继承了另一个系统异常类型(如System.FormatException)的自定义异常

现在处理这两种方法的唯一方法是拥有两个自定义基类型并复制每个catch语句.

重构

如果.net框架只是简单地寻找诸如System.IException之类的东西,那么你可以简单地拥有一个自定义异常接口,例如CompanyName.ILoggedException,继承System.IException,所有自定义异常类型都会实现.因此,您的新catch代码看起来像:

try
{
    // Do something.
}
catch (ILoggedException)
{
    // Already logged so just rethrow.
    throw;
}
catch (IException ex)
{
    // TODO: Log exception.
    throw new CustomException("Failed doing something.", ex);
}
Run Code Online (Sandbox Code Playgroud)

框架是否有这样的实际原因?或者这是在未来版本的.Net框架中要求的东西吗?

.net c# exception-handling interface exception

17
推荐指数
4
解决办法
8296
查看次数

System.Windows.Media.DrawingVisual.RenderOpen()一段时间后出错

使用案例:我正在使用WPF在Web上下文中动态覆盖图像上的文本.

解决方案:我使用的是DrawingContextDrawingVisual(包裹在一个using声明中)来绘制原始位和覆盖文本.

问题:在几千个请求之后,该[DrawingVisual].RenderOpen()方法开始拒绝执行并抛出以下异常:

The system cannot find the file specified System.ComponentModel.Win32Exception UInt16 RegisterClassEx(WNDCLASSEX_D) at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
at System.Windows.Media.MediaContextNotificationWindow..ctor(MediaContext ownerMediaContext)
at System.Windows.Media.MediaContext..ctor(Dispatcher dispatcher)
at System.Windows.Media.MediaContext.From(Dispatcher dispatcher)
at System.Windows.Media.Visual.VerifyAPIReadWrite()
at System.Windows.Media.DrawingVisual.RenderOpen()
at ...
Run Code Online (Sandbox Code Playgroud)

临时修复:唯一的解决方法是在服务器上回收IIS应用程序池,将问题解决几个小时.

问题:任何人都想过这个问题的原因(泄漏,线程,非托管代码等)?有没有其他方法可以在图像上获取文本,避免绘图视觉?也许将几何图形写入位图并直接覆盖位图?

.net iis wpf rendering system.windows.media

15
推荐指数
1
解决办法
1170
查看次数

你如何从F#类型的提供者提供一个有区别的联盟

是否有可能从F#类型的提供者中发出有区别的联合类型?如果是这样,是否有可用的示例代码?

f# discriminated-union type-providers

11
推荐指数
0
解决办法
351
查看次数

创建clickonce webdeploy包

是否可以构建包含可以使用标准webdeploy工具部署到Web服务器的clickonce应用程序的Web部署包?

这将是理想的过程:

  1. MSBuild"YourFullyQualifiedProjectName.csproj/vbproj"/ T:包
  2. obj\Debug\Package\YourFullyQualifiedProjectName.deploy.cmd/Y.

这背后的原因是我们可以构建整个解决方案,包括Web包,运行所有测试,然后只在测试通过后部署.

我目前正在考虑对临时文件夹进行基于文件的部署,将其复制到Web项目中,然后打包Web项目.有更整洁的解决方案吗?

.net msbuild clickonce msdeploy webdeploy

7
推荐指数
1
解决办法
3167
查看次数

在异步工作流中捕获HttpClient超时

我打电话HttpClient通过Async.AwaitTask,从代理(MailboxProcessor)中被调用.我想在HTTP调用期间捕获错误,因此try...with在异步工作流中使用了a ,但它完全错过捕获客户端超时异常,然后导致代理崩溃.

最小复制:

#r "System.Net.Http"
open System
open System.Net.Http

let client = new HttpClient()
client.Timeout <- TimeSpan.FromSeconds(1.)
async {
    try
        let! content = Async.AwaitTask <| client.GetStringAsync("http://fake-response.appspot.com/?sleep=30")
        return content
    with ex ->
        // Does not catch client-side timeout exception
        return "Caught it!"
}
|> Async.RunSynchronously
// Throws System.OperationCanceledException: The operation was canceled
Run Code Online (Sandbox Code Playgroud)

我可以通过使它完全同步来修复它,但更愿意保持整个堆栈异步,因为可能并行运行大量这些:

#r "System.Net.Http"
open System
open System.Net.Http

let client = new HttpClient()
client.Timeout <- TimeSpan.FromSeconds(1.)
try
    Async.AwaitTask <| client.GetStringAsync("http://fake-response.appspot.com/?sleep=30")
    |> Async.RunSynchronously
with ex …
Run Code Online (Sandbox Code Playgroud)

f# dotnet-httpclient f#-async

7
推荐指数
1
解决办法
414
查看次数