取消以下内容的正确方法是什么?
var tcpListener = new TcpListener(connection);
tcpListener.Start();
var client = await tcpListener.AcceptTcpClientAsync();
Run Code Online (Sandbox Code Playgroud)
简单地调用tcpListener.Stop()
似乎导致a ObjectDisposedException
并且该AcceptTcpClientAsync
方法不接受CancellationToken
结构.
我完全错过了一些明显的东西吗
我想我在这里要求关于正确应用WPF的讲座,但是我会抓住机会,因为我已经结束了.我认为这可能主要是因为我完全接受WPF模板和样式的嗜睡,所以我很高兴听到任何这样的讲座.
我正在写一种音频编辑器/事件编排器.我有一个我很满意的曲目编辑器.但是,我构建它主要是出于自定义控件(我知道,这可能是一个WPF罪).为了与主题保持一致,我想为曲目制作标准标题,但我希望单独的曲目"类型"能够定义该标题中的内容.我认为控制器在边缘上定义了一种"抓地力",然后允许实施者"填充"该物质将很好地工作.但是,我不知道如何在不使用样式的情况下在WPF中执行此操作,即使我最终使用样式,我也想了解这一点.
这可能归结为想要一种简单的ContentControl控件(例如按钮)的一种示例实现,而不能找到一个(除了AvalonDock,最终使用 - 正确的我确定 - 为此模板).在我看来,xaml看起来像这样:
<ContentControl x:Class="TestArea.CustomContentControl2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Hello"/>
<ContentPresenter Grid.Column="1"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
但是,当然,这不起作用.我很确定我可以通过在幕后玩重载来扯掉同样的东西,但如果我可以做这样的事情会很好.我真的必须把所有可怕的,程序性的方法放在我身后并使用你所说的这些风格吗?如果是这样,有人至少可以告诉我该按钮在框架中看起来像什么?
我们有一个非常棘手的互操作问题,其中用于初始化第三方系统的线程必须是用于终止它的相同线程.不这样做会导致死锁.我们正在IIS中托管的WCF服务执行互操作.目前,这种清理工作已经完成,通常效果很好.不幸的是,在负载很重的情况下,IIS会做一个粗鲁的卸载,我们永远不会打电话处理.我们可以将关闭逻辑移动到关键终结器中,但这没有用,因为我们不再能够访问初始化线程!在这一点上,我们唯一的办法似乎是通知CLR AppDomain现在可能处于损坏状态.但是,我不知道该怎么做(或者甚至可能).这可能是在阶级合同的效用,但我承认我并不完全理解这些合同.
编辑:或者,这可以被视为终结器中的线程亲和性问题.如果有人有一个聪明的解决方案,我都是耳朵:)
我正在研究一个需要广泛的C API互操作的系统.部分互操作需要在任何操作之前和之后初始化和关闭相关系统.如果不这样做将导致系统不稳定.我通过简单地在核心一次性环境类中实现引用计数来实现这一点,如下所示:
public FooEnvironment()
{
lock(EnvironmentLock)
{
if(_initCount == 0)
{
Init(); // global startup
}
_initCount++;
}
}
private void Dispose(bool disposing)
{
if(_disposed)
return;
if(disposing)
{
lock(EnvironmentLock)
{
_initCount--;
if(_initCount == 0)
{
Term(); // global termination
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很好,并完成了目标.但是,由于任何互操作操作必须使用块嵌套在FooEnvironment中,因此我们始终锁定并且分析表明此锁定占运行时期间完成工作的近50%.在我看来,这是一个基本的概念,.NET或CLR中的某些东西必须解决它.有没有更好的方法来进行引用计数?
我希望从C#程序集中使用英特尔的数字随机数生成器(Ivy Bridge中的RDRAND指令).我看过cpp libs,但我希望有一个更"管理"的解决方案.有任何想法吗?
c# ×5
.net ×3
async-await ×1
asynchronous ×1
cer ×1
concurrency ×1
cryptography ×1
iis ×1
intel ×1
interop ×1
locking ×1
random ×1
rdrand ×1
wpf ×1
wpf-controls ×1