当您从表单中订阅对象上的事件时,您实际上是将对回调方法的控制权移交给事件源.您不知道该事件源是否会选择在不同的线程上触发事件.
问题是,当调用回调时,您不能假设您可以对表单进行更新控制,因为如果在与运行表单的线程不同的线程上调用事件回调,则有时这些控件将引发异常.
我正在寻找能够提供有关正在运行的.NET WinForms应用程序的交互式元数据的东西.
基本上,我希望能够将鼠标悬停在正在运行的WinForms应用程序上,让检查员突出显示各种控件,让我检查大小,位置,父级等属性.
我本来可以发誓我已经在某个地方见过这个,但我所有的搜索都在变成虚无...
我是WCF数据服务的新手,所以我一直在玩.经过一些初步测试后,我对测试数据服务的性能感到失望.
我意识到因为WCF DS是基于HTTP的,所以协议中固有的开销,但我的测试仍然比我预期的慢:
环境:
码:
测试计划:
结果:
哎哟.这比EF慢约20倍.
由于WCF数据服务是HTTP,因此没有机会进行HTTP连接重用,因此每次迭代都会强制客户端重新连接到Web服务器.但肯定还有比这更多的事情.
EF本身相当快,并且同样的EF代码/模型被重用于服务和直接到EF客户端测试.对数据服务中的Xml序列化和反序列化会有一些开销,但那么多!?!我以前在Xml序列化方面表现很好.
我将使用JSON和协议缓冲区编码运行一些测试,以确定我是否可以获得更好的性能,但我很好奇社区是否有任何关于加快这一点的建议.
我对IIS不太满意,所以也许有一些IIS调整(缓存,连接池等)可以设置来改善这个?
这似乎是一个基本上简单的问题.我有一个带有列表框的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) 有谁知道是否有一个可以可靠地解析OData协议Uri的开源.NET包装器?
我不是在寻找指向WCF数据服务的指针......我正在创建一个基于WCF的数据查询服务(出于复杂的原因)不能成为真正的Atom/OData服务,但我真的很喜欢OData Uri的表现力用于标识数据源和查询参数.此外,我们可能会在未来的某个时间公开OData端点.
我通过WCF数据服务API查看(cursorally),似乎没有一个整齐的包装ODataUri类暴露服务主机,资源路径和查询参数.我可以写一个,但在我做之前,我宁愿看看有人已经做过了.
我有一个流媒体服务器,合同看起来像这样:
[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) 我注意到,在标准.NET WinForms表单中分配给linklabel控件的键盘快捷键无法正常工作.
我创建了一个LinkLabel控件实例,并将Text属性指定为"Select&All".对于大多数控件(标签,按钮,单选按钮等),这将导致Alt+ A成为触发默认事件(Clicked)的指定键盘快捷键.LinkLabel没有发生这种情况(虽然它可以用于其他控件)
有任何想法吗?
谢谢查理的正确答案.正是我需要的.我做了一些修改,因为这段代码片段不会按原样编译.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) 我正在尝试获取目录服务对象的"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 : …
我正在开发一个大型的一次点击应用程序(150MB,> 200个DLL),作为交互式调试过程的一部分,我想只更新1个DLL并重新启动应用程序,而无需重新构建和重新部署整个应用程序.
那可能吗?如果是这样......怎么样?
问题澄清: 2009年9月26日
我知道可以在下载整个应用程序后手动修补客户端上的DLL,然后直接从本地缓存文件夹启动客户端.EXE.这不是重点.我想知道如何在服务器上更改/添加DLL,并让所有客户端在下次启动时获取新的DLL.我正在寻找一个"将DLL复制到此文件夹并编辑此文本文件"的答案,如果可能的话.我特别不希望在服务器上重建或重新部署单击一次安装...只需用我在IDE中编译的单个DLL手动修补它.
我正在寻找通过慢速卫星连接创建数据查询WCF服务,我真的很喜欢WCF数据服务.我看到的问题是HTTP是一种非常冗长的格式,因为我所做的一切都是内部和.NET,是否可以使用NetTcpBinding来减少一些开销?
这甚至可能吗?可取?
在普通的WCF请求/回复合同中,您可以使用以下内容读取邮件标头:
OperationContract.Current.IncomingMessageHeaders
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚的是如何在双工合同的回调方面做到这一点.回调实现内部OperationContext.Current
是null
.
编辑2013年4月5日:我正在使用基于net.tcp的自定义绑定,但有很多自定义.例如,使用协议缓冲区消息编码而不是Xml.还有一些自定义安全性.
我有一个简单的标签,我想显示一些内置标签"标题"的诊断数据.我没有在水平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"
我究竟做错了什么?