小编Sim*_*bee的帖子

如何将事件回调变为我的win表单线程安全?

当您从表单中订阅对象上的事件时,您实际上是将对回调方法的控制权移交给事件源.您不知道该事件源是否会选择在不同的线程上触发事件.

问题是,当调用回调时,您不能假设您可以对表单进行更新控制,因为如果在与运行表单的线程不同的线程上调用事件回调,则有时这些控件将引发异常.

.net c# events multithreading winforms

38
推荐指数
3
解决办法
3万
查看次数

是否有WinForm控制检查器应用程序?

我正在寻找能够提供有关正在运行的.NET WinForms应用程序的交互式元数据的东西.

基本上,我希望能够将鼠标悬停在正在运行的WinForms应用程序上,让检查员突出显示各种控件,让我检查大小,位置,父级等属性.

我本来可以发誓我已经在某个地方见过这个,但我所有的搜索都在变成虚无...

.net debugging winforms

32
推荐指数
2
解决办法
1万
查看次数

如何提高WCF数据服务性能

我是WCF数据服务的新手,所以我一直在玩.经过一些初步测试后,我对测试数据服务的性能感到失望.

我意识到因为WCF DS是基于HTTP的,所以协议中固有的开销,但我的测试仍然比我预期的慢:

环境:

  • 所有在一个盒子:四核64位笔记本电脑与4GB RAM运行W7.体面的机器.
  • 具有16个表的小型SQL数据库(SQLExpress 2008 R2)...正在测试的表有243行.
  • 在IIS中托管我的测试服务,包含所有默认值.

码:

  • 我为这个数据库创建了一个实体框架模型(DataContext)(VS2010的股票代码).
  • 我已经基于这个模型创建了一个数据服务.
  • 我已经创建了一个客户端,该服务器具有针对此服务的直接服务引用(ObjectContext)(VS2010的股票代码)
  • 在客户端我也可以直接调用EF模型并使用Native SQL(ADO.NET SqlConnection)

测试计划:

  • 每次迭代都连接到数据库(有一个重用连接的选项),查询目标表中的所有行("EVENTS"),然后对它们进行计数(从而强制执行任何延迟的提取).
  • 为Native SQL(SqlConnection/SqlCommand),实体框架(DataContext)和WCF数据服务(ObjectContext)分别运行25次迭代.

结果:

  • Native SQL的25次迭代:436ms
  • 实体框架的25次迭代:656ms
  • WCF数据服务的25次迭代:12110ms

哎哟.这比EF慢约20倍.

由于WCF数据服务是HTTP,因此没有机会进行HTTP连接重用,因此每次迭代都会强制客户端重新连接到Web服务器.但肯定还有比这更多的事情.

EF本身相当快,并且同样的EF代码/模型被重用于服务和直接到EF客户端测试.对数据服务中的Xml序列化和反序列化会有一些开销,但那么多!?!我以前在Xml序列化方面表现很好.

我将使用JSON和协议缓冲区编码运行一些测试,以确定我是否可以获得更好的性能,但我很好奇社区是否有任何关于加快这一点的建议.

我对IIS不太满意,所以也许有一些IIS调整(缓存,连接池等)可以设置来改善这个?

wcf astoria wcf-data-services wcf-ria-services

24
推荐指数
1
解决办法
1万
查看次数

如何检测项目是否添加到ListBox(或CheckedListBox)控件

这似乎是一个基本上简单的问题.我有一个带有列表框的WinForms对话框.此控件不是通过数据绑定填充,而是通过调用填充

listBox.Items.Add (obj);
Run Code Online (Sandbox Code Playgroud)

这个调用可能是从各个地方异步进行的,我想挂钩列表框并观察其数据成员的变化,以便我可以执行其他UI更改(例如启用或禁用与基于列表框交互的控件关于列表中的项目数).

不幸的是,除非我完全无能为力,否则似乎没有一个事件或虚拟方法可以被钩住来检测这一点.我可以挂钩选择更改和(对于CheckedListBox)我可以挂钩检查状态更改.但不是对基础数据集的更改.

我知道这在Win32中是可能的(有一个窗口消息).我错过了什么?


[西蒙编辑]

我被指向正确的解决方案(我已经标记为已接受的答案),它将覆盖ListBox的WndProc方法并手动处理列表框消息.这是我确定(并且有效)的解决方案.可以对其进行修改以在事件中提供更多详细信息,或将消息拆分为单独的事件,但是对于我的需求,这已足够.

using System;
using System.Windows.Forms;

public class CheckedListBoxEx : CheckedListBox
{
    public CheckedListBoxEx() { }

    private const int LB_ADDSTRING = 0x180;
    private const int LB_INSERTSTRING = 0x181;
    private const int LB_DELETESTRING = 0x182;
    private const int LB_RESETCONTENT = 0x184;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == LB_ADDSTRING ||
            m.Msg == LB_INSERTSTRING ||
            m.Msg == LB_DELETESTRING ||
            m.Msg == LB_RESETCONTENT)
        {
            ItemsChanged(this, EventArgs.Empty);
        }
        base.WndProc(ref m);
    }

    public …
Run Code Online (Sandbox Code Playgroud)

.net c# listbox checkedlistbox winforms

21
推荐指数
1
解决办法
2万
查看次数

是否有OData协议Uri的.NET类包装器

有谁知道是否有一个可以可靠地解析OData协议Uri的开源.NET包装器?

我不是在寻找指向WCF数据服务的指针......我正在创建一个基于WCF的数据查询服务(出于复杂的原因)不能成为真正的Atom/OData服务,但我真的很喜欢OData Uri的表现力用于标识数据源和查询参数.此外,我们可能会在未来的某个时间公开OData端点.

我通过WCF数据服务API查看(cursorally),似乎没有一个整齐的包装ODataUri类暴露服务主机,资源路径和查询参数.我可以写一个,但在我做之前,我宁愿看看有人已经做过了.

.net wcf wcf-data-services odata

8
推荐指数
1
解决办法
2018
查看次数

如何检测WCF流媒体客户端是否断开Mid-Stream

我有一个流媒体服务器,合同看起来像这样:

[ServiceContract]
public interface IStreamingService
{
    [OperationContract(Action = "StreamingMessageRequest", ReplyAction = "StreamingMessageReply")]
    Message GetStreamingData(Message query);
}
Run Code Online (Sandbox Code Playgroud)

这是一个基本的实现,删除了一些东西(如错误处理)以简化操作:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[ErrorBehavior(typeof(StreamingServiceErrorHandler))]
public class StreamingService : IStreamingService
{
    public StreamingService()
    {
    }

    public Message GetStreamingData(Message query)
    {
        var dataQuery = query.GetBody<DataQuery>();

        // Hook up events to let us know if the client disconnects so that we can stop the query...
        EventHandler closeAction = (sender, ea) =>
        {
            dataQuery.Stop();
        };
        OperationContext.Current.Channel.Faulted += closeAction;
        OperationContext.Current.Channel.Closed += closeAction;

        Message streamingMessage = Message.CreateMessage(
            MessageVersion.Soap12WSAddressing10,
            "QueryMessageReply", …
Run Code Online (Sandbox Code Playgroud)

c# streaming wcf

8
推荐指数
1
解决办法
1776
查看次数

使用LinkLabel控件的键盘快捷键

我注意到,在标准.NET WinForms表单中分配给linklabel控件的键盘快捷键无法正常工作.

我创建了一个LinkLabel控件实例,并将Text属性指定为"Select&All".对于大多数控件(标签,按钮,单选按钮等),这将导致Alt+ A成为触发默认事件(Clicked)的指定键盘快捷键.LinkLabel没有发生这种情况(虽然它可以用于其他控件)

  • 我已经验证键盘快捷键不重复.
  • 我检查了快捷方式是否设置焦点而不是触发Clicked.重点保持不变.
  • 我已验证UseMnemonic属性设置为true.

有任何想法吗?


谢谢查理的正确答案.正是我需要的.我做了一些修改,因为这段代码片段不会按原样编译.LinkLabelLinkClickedEventArgs需要一个LinkLabel.Link作为构造参数,而不是谢谢LinkLabel.

class LinkLabelEx : LinkLabel
{
    protected override bool ProcessMnemonic(char charCode)
    {
        if (base.ProcessMnemonic(charCode))
        {
            if (this.Links.Count == 0)
                return false;
            OnLinkClicked(new LinkLabelLinkClickedEventArgs(this.Links[0]));
            return true;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# keyboard-shortcuts linklabel winforms

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

如何将System.DirectoryEntry"uSNChanged"属性值更改为Int64

我正在尝试获取目录服务对象的"uSNChanged"值的Int64值.不幸的是,它总是以某种COM对象的形式回归.我尝试使用转换为Int64,调用Int64.Parse(),并调用Convert.ToInt64().这些都不起作用.

对于给定的DirectoryEntry对象,此代码将显示以下属性:

    private static void DisplaySelectedProperties(DirectoryEntry objADObject)
    {
        try
        {
            string[] properties = new string[] {
                "displayName",
                "whenCreated",
                "whenChanged",
                "uSNCreated",
                "uSNChanged",
            };

            Console.WriteLine(String.Format("Displaying selected properties of {0}", objADObject.Path));
            foreach (string strAttrName in properties)
            {
                foreach (var objAttrValue in objADObject.Properties[strAttrName])
                {
                    string strAttrValue = objAttrValue.ToString();
                    Console.WriteLine(String.Format("   {0, -22} : {1}", strAttrName, strAttrValue));
                }
            }
            Console.WriteLine();
        }
        catch (Exception ex)
        {
            throw new ApplicationException(string.Format("Fatal error accessing: {0} - {1}", objADObject.Path, ex.Message), ex);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是输出:

Displaying selected properties of LDAP://server/o=org/cn=obj
   displayName            : …

directoryservices active-directory directoryentry int64

6
推荐指数
1
解决办法
4659
查看次数

如何在ClickOnce安装中只更新一个DLL?

我正在开发一个大型的一次点击应用程序(150MB,> 200个DLL),作为交互式调试过程的一部分,我想只更新1个DLL并重新启动应用程序,而无需重新构建和重新部署整个应用程序.

那可能吗?如果是这样......怎么样?

问题澄清: 2009年9月26日

我知道可以在下载整个应用程序后手动修补客户端上的DLL,然后直接从本地缓存文件夹启动客户端.EXE.这不是重点.我想知道如何在服务器上更改/添加DLL,并让所有客户端在下次启动时获取新的DLL.我正在寻找一个"将DLL复制到此文件夹并编辑此文本文件"的答案,如果可能的话.我特别希望在服务器上重建或重新部署单击一次安装...只需用我在IDE中编译的单个DLL手动修补它.

clickonce

5
推荐指数
1
解决办法
5731
查看次数

你可以在NetTcpBinding中使用WCF数据服务(ne OData,ne Astoria,ne ADO.NET Data Service)吗?

我正在寻找通过慢速卫星连接创建数据查询WCF服务,我真的很喜欢WCF数据服务.我看到的问题是HTTP是一种非常冗长的格式,因为我所做的一切都是内部和.NET,是否可以使用NetTcpBinding来减少一些开销?

这甚至可能吗?可取?

wcf nettcpbinding wcf-data-services odata

5
推荐指数
1
解决办法
2025
查看次数

如何在双工回调中读取WCF消息头?

在普通的WCF请求/回复合同中,您可以使用以下内容读取邮件标头:

OperationContract.Current.IncomingMessageHeaders
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚的是如何在双工合同的回调方面做到这一点.回调实现内部OperationContext.Currentnull.

编辑2013年4月5日:我正在使用基于net.tcp的自定义绑定,但有很多自定义.例如,使用协议缓冲区消息编码而不是Xml.还有一些自定义安全性.

wcf message duplex operationcontext

5
推荐指数
1
解决办法
496
查看次数

为什么在这个Xaml中会忽略StringFormat?

我有一个简单的标签,我想显示一些内置标签"标题"的诊断数据.我没有在水平StackPanel中使用2个标签,而是试着尝试使用{Binding StringFormat}.这是XAML:

   <StackPanel Orientation="Horizontal">
       <Label Content="{Binding Path=SomeData, StringFormat=Value: {0}}" />
   </StackPanel>
Run Code Online (Sandbox Code Playgroud)

在这种情况下SomeData,视图模型上的字符串属性,它正确绑定到视图.值为SomeData"ABC".

我希望标签显示:"价值:ABC"它不是.它显示简单:"ABC"

我究竟做错了什么?

wpf xaml string-formatting

1
推荐指数
2
解决办法
1087
查看次数