我有以下两种数据结构.
首先,应用于对象三元组的属性列表:
Object1 Object2 Object3 Property Value
O1 O2 O3 P1 "abc"
O1 O2 O3 P2 "xyz"
O1 O3 O4 P1 "123"
O2 O4 O5 P1 "098"
Run Code Online (Sandbox Code Playgroud)
二,继承树:
O1
O2
O4
O3
O5
Run Code Online (Sandbox Code Playgroud)
或者视为关系:
Object Parent
O2 O1
O4 O2
O3 O1
O5 O3
O1 null
Run Code Online (Sandbox Code Playgroud)
这种语义是O2从O1继承属性; O4 - 来自O2和O1; O3 - 来自O1; 和O5 - 来自O3和O1,按优先顺序排列.
注1:我有一种有效的方法来选择给定对象的所有孩子或所有父母.目前这是使用左右索引实现的,但hierarchyid也可以工作.这现在看起来并不重要.
注2:我有触发器确保"对象"列始终包含所有可能的对象,即使它们实际上不必存在(即没有定义父或子).这使得可以使用inner joins而不是效率低得多的outer joins.
目标是:给定一对(Property,Value),返回具有该属性的所有对象三元组,该属性具有显式定义或从父级继承.
注1:一个对象三重(X,Y,Z)被认为是三重"父" (A,B,C),当它为真,要么X = A或 …
我有一个WPF应用程序,而且速度很慢.
它不是渲染.首先,渲染非常简单,其次,我使用WPF Performance Toolkit查看它 - 没有.
它不在我自己的代码中.首先,单元测试工作很快,其次,如果我用空白替换所有DataTemplates,一切都很快.
到目前为止,看起来缓慢的部分是模板实例化.也就是说,当你启动应用程序并打开一些复杂的屏幕时,需要花费很多时间.而且" 很多 "我的意思是" 很多 ".有时可能长达3-5秒 - 例如,当有一个包含100行的数据网格时.但是当你转到另一个标签,然后回到同一个屏幕时,它会快速打开(只要它的视图模型保持不变).
这非常烦人,不仅因为它很慢,而且因为我无能为力.如果我对缓慢有一些控制,我可能会显示一些" 开放,请等待 "的消息或某些东西......
此外,当我查看其他一些WPF应用程序(最值得注意的是,ILSpy)时,尽管数据量很大,但它们似乎工作得相当快.这让我相信我可能做错了什么.但我不知道从哪里开始.
有任何想法吗?任何经典错误?有小费吗?
更新:我想,我需要了解在WPF中应用程序启动之前显示对话框的"正确","支持"方式是什么.
这是代码:
public partial class App : Application
{
[STAThread]
public static void Main()
{
var app = new App();
app.InitializeComponent();
new DialogWindow().ShowDialog();
app.Run( new MainWindow() );
}
}
Run Code Online (Sandbox Code Playgroud)
该DialogWindow显示为预期.
但关闭后,应用程序立即退出.MainWindow根本不显示!
我做了一些调试并将问题追溯到:
appMainWindow,因为此时没有MainWindow.ShutdownCallback在调度程序队列上发布.app.Run被调用,队列中的第一件事就是ShutdownCallback,这自然会导致应用程序立即关闭.鉴于这一分析,有一个明显的解决办法:建立MainWindow之后App,从而使得它app的主窗口,这将防止DialogWindow从导致应用程序关闭.
然而,这是困扰我的.
首先,这看起来像是一个肮脏的黑客.我的意思是,没有明确的理由按此顺序创建窗口,我只通过一些调试找到了这个.这不是受支持的方式.
其次,这显然是一个错误.我的意思是,如果在关闭后创建第二个窗口没有明确支持,它应该抛出一些InvalidOperationException,对吧?
第三,这不仅是一个错误,而且看起来像一个非常天真的错误,就像多线程初学者会创造的那样.
所有这些让我相信,也许我没有得到一些基本的东西?也许我根本没有意义?也许这一切都应该以某种不同的方式完成?
这里有一些背景知识:
应用程序必须在启动时进行一些引导.检查这一点,设置异常处理程序,记录 - 你知道,通常的东西.在此过程中,可能需要向用户请求帮助 - 这是对话框的用途.
我绝对不想把所有这些都放在某种执行的状态机上MainWindow.IsVisibleChanged或类似的东西上.我想保持它非常简单,简洁和直接 - 引导代码应该是这样的方式,这样就可以很容易地用肉眼发现错误.
我试着去谷歌.Microsoft Connect不接受Service Bus的错误.Azure门户发送到MS论坛或StackOverflow - 所以我在这里.
问题实际上在标题中:如何报告服务总线的错误?
(不是Azure版本,而是您在本地安装的版本)
Microsoft.Cloud.ServiceBus.dll有参考Microsoft.Cloud.Common.AzureStorage.dll.它使用该程序集中的一种类型 - 即StorageAccountInfo.它是配置部分(即NamespacePolicyDataStoreFactorySection.Parameters.BlobStorageAccountInfo)的一部分,但显然只在Azure环境中有意义,并且从未在内部部署场景中使用过.Microsoft.Cloud.Common.AzureStorage.dll服务总线1.1实际上没有附带.我试图在各种SDK和Azure工具包,样本和诸如此类(我有很多)以及在线等方面找到它 - 并找到有关该DLL的zippo信息或从何处获取它.这是我发现它的唯一地方.mscorlib.dllv4.6.7.0(与VS2015 CTP5一起提供)与之前的版本4.0.30319.34014相比略有变化System.Attribute.InternalGetCustomAttributes(PropertyInfo,Type,bool),更确切地说,这一行.这条线在以前的版本中不存在mscorlib,一切都很好.但现在它确实存在,导致属性类型被触及,这导致加载DLL失败,因为DLL不存在.NamespacePolicyDataStoreFactorySection工作原理如下: ConfigurationManager.GetSection ->
... ->
BaseConfigurationRecord.GetSectionRecursive ->
... ->
BaseConfigurationRecord.CallCreateSection ->
MgmtConfigurationRecord.CreateSection ->
ConfigurationElement.Reset ->
ConfigurationElement.get_Properties ->
ConfigurationElement.PropertiesFromType ->
ConfigurationElement.CreatePropertyBagFromType ->
Attribute.GetCustomAttribute (for property BlobStorageAccountInfo of type StorageAccountInfo) ->
... ->
Attribute.InternalGetCustomAttributes(PropertyInfo) ->
Attributes.GetIndexParameterTypes ->
RuntimePropertyInfo.GetIndexParameters ->
... -> …Run Code Online (Sandbox Code Playgroud) 或者" 你如何确保你的所有绑定都保持正确? "
(这有点长,但请耐心等待,我试着让它尽可能短)
请考虑以下示例:
<TextBox Name="tb" />
<TextBlock Text="{Binding Text.TheProp, ElementName=tb}" />
Run Code Online (Sandbox Code Playgroud)
在编译时完全知道绑定是不正确的(即解析器知道元素的类型tb,因此,它知道它的Text属性的类型,因此,它知道它TheProp不存在).
但是,此代码将编译并运行(尽管在调试输出中有绑定错误消息).
在某些情况下,这种行为可能非常方便:无论我的数据类型是什么,只要它具有适当命名的属性,我就可以了.因此,我们得到了一种"声明性的鸭子打字".
然而,鸭子打字并不总是一件好事.
具体来说,在使用MVVM模式时,我(大多数时候)知道所有ViewModel对象的确切类型.另一方面,模型随着时间的推移变得越来越复杂,这使我对未来的重构感到担忧:如果我决定重命名某些属性,或者上帝禁止将它们放在一个单独的聚合对象中,该怎么办?那么我的所有绑定会发生什么?我是否必须手动耙所有XAML文件?即使没有重构 - 如果我只是打错了怎么办?
在XAML的其他地方已经解决了类似的问题.例如,如果您输入了不正确的属性名称Style/Setter/@Property,则会出现编译时错误.
TemplateBinding还提供此类验证.哪个非常方便.
所以,理想情况下,我希望看到这样的事情:
ProductViewModel.cs:
public class ProductViewModel
{
public Name { get; set; }
public Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
ProductView.XAML:
<UserControl x:Class="Shopping.View.ProductView"
x:DataContextType="vm:ProductViewModel"
xmlns:vm="clr-namespace:Shopping.ViewModel"
... >
<TextBox Text="{Binding Name}" /> <!-- OK -->
<TextBox Text="{Binding Price}" /> <!-- OK -->
<TextBox Text="{Binding ABC}" /> <!-- Compile time error: …Run Code Online (Sandbox Code Playgroud) 假设我有一个带文本框和OK/Cancel按钮的模态对话框.它建立在MVVM上 - 即它有一个ViewModel对象,该对象具有文本框绑定的字符串属性.
说,我在文本框中输入一些文本,然后抓住我的鼠标并单击"确定".一切正常:在单击时,文本框失去焦点,这会导致绑定引擎更新ViewModel的属性.我得到了我的数据,每个人都很开心.
现在假设我不使用鼠标.相反,我只是按下Enter了键盘.这也导致"确定"按钮"点击",因为它被标记为IsDefault="True".但猜猜怎么了?文本框没有按没有在这种情况下失去焦点,因此,绑定引擎仍然天真无知,我没有得到我的数据.党!
同一场景的另一个变体:假设我在主窗口中有一个数据输入表单,在其中输入一些数据,然后点击Ctrl+S"保存".你猜怎么着?我的最新条目没有得到保存!
这可有点通过使用补救UpdateSourceTrigger=PropertyChanged,但是这是不可能的.
一个明显的例子是使用StringFormatwith binding - 当我试图输入时,文本不断跳回"格式化"状态.
我自己遇到的另一个案例是,当我在viewmodel的属性设置器中进行一些耗时的处理时,我只想在用户"完成"输入文本时执行它.
这似乎是一个永恒的问题:我记得自从我开始使用交互式界面以来,从很久以前就试图系统地解决它,但我从来没有成功过.在过去,我总是最终使用某种黑客 - 例如,向每个"演示者"(如"MVP")添加"EnsureDataSaved"方法,并在"关键"点或类似的地方调用它. ..
但是对于WPF的所有酷炫技术以及空洞的炒作,我预计他们会想出一些好的解决方案.
宏伟的设计如下:
很简单,嗯?在过去的几天里,我曾经使用自己的基于UDP广播的发现机制来构建这类东西.
但是现在我觉得我很酷,很时髦,并且在Ad Hoc模式下使用常规的WCF Discovery.它的工作原理!谁能说出来?:-)
但并不完全.正如我之前在这里和那里所指出的,该发现从服务的配置返回硬编码的URL.也就是说,如果服务<baseAddresses><add baseAddress="net.tcp://localhost:1234/My/Service" /></baseAddresses>在其配置文件中,那么这正是我将从发现客户端获得的 - 包括"localhost"部分.
不用说,如果我尝试使用该URL调用服务,结果并不令人兴奋.
所以问题是:如何让发现客户端给我可用的URL而不是localhost-ish垃圾?
为了节省每个人的时间,一些不起作用的想法:
换句话说,我不需要调整服务,而是让发现客户端给我发现响应来自的地址.
问题很简单:当我编写lambda表达式时,C++编译器为我自动生成的仿函数对象的生命周期是什么?
我做了一个快速搜索,但找不到满意的答案.特别是,如果我在某处传递lambda,并在那里记住它,然后我就会超出范围,一旦我的lambda稍后调用并尝试访问我的堆栈分配但不再存活,捕获的变量会发生什么?或者编译器是否以某种方式阻止了这种情况?或者是什么?
我现在意识到这个问题很愚蠢,我本应该提出这个问题.事后来看,我不明白为什么我甚至都会问这个问题.
问题出在这里:https://github.com/fsharp/FSharp.Compiler.Service/issues/544
我正在使用FSharp编译器服务来解析一些F#代码.
我现在面对的特定代码是:
let f x y = x+y
let g = f 1
let h = (g 2) + 3
Run Code Online (Sandbox Code Playgroud)
该程序(+)在最后一行没有调用的情况下产生TAST .也就是说,编译器服务返回TAST,就像最后一行一样let h = g 2.
问题是:这是一个我应该报告的合法错误,还是我错过了什么?
我有一个ASP.NET MVC应用程序.我需要一种方法来部署它.
但
我不需要将它复制到我自己的Web服务器上.它并不意味着它是一个可在互联网上获得的网站.没有.
相反,我需要我的用户能够在他们自己的服务器上安装它.从互联网上可以看到或不可见.
也就是说,我需要创建一个MSI包(或EXE自解压安装程序,或其他任何东西),我的客户可以双击它,MVC应用程序应该安装在他们的本地IIS上.
当然,我可以简单地编写一些代码来提取文件,将它们复制到本地硬盘驱动器,然后在IIS中创建一个网站或虚拟目录,等等等等.但有些东西告诉我应该有一个更简单的方法.比如说,WiX扩展已经做到了.或者其他的东西.
注意:应用程序非常简单.不需要数据库,特权,SMTP服务器配置......或者,实际上,任何类型的配置都是如此.只需复制文件并创建IIS应用程序.
c# ×5
wpf ×4
binding ×2
.net ×1
.net-core ×1
asp.net-mvc ×1
azure ×1
c#-4.0 ×1
c++ ×1
data-binding ×1
datasource ×1
discovery ×1
f# ×1
lambda ×1
modal-dialog ×1
mscorlib ×1
performance ×1
servicebus ×1
sql ×1
sql-server ×1
templates ×1
tree ×1
wcf ×1