我正在学习async/await,并遇到了需要同步调用异步方法的情况.我怎样才能做到这一点?
异步方法:
public async Task<Customers> GetCustomers()
{
return await Service.GetCustomersAsync();
}
Run Code Online (Sandbox Code Playgroud)
正常使用:
public async void GetCustomers()
{
customerList = await GetCustomers();
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用以下内容:
Task<Customer> task = GetCustomers();
task.Wait()
Task<Customer> task = GetCustomers();
task.RunSynchronously();
Task<Customer> task = GetCustomers();
while(task.Status != TaskStatus.RanToCompletion)
Run Code Online (Sandbox Code Playgroud)
我也从这里尝试了一个建议,但是当调度程序处于暂停状态时它不起作用.
public static void WaitWithPumping(this Task task)
{
if (task == null) throw new ArgumentNullException(“task”);
var nestedFrame = new DispatcherFrame();
task.ContinueWith(_ => nestedFrame.Continue = false);
Dispatcher.PushFrame(nestedFrame);
task.Wait();
}
Run Code Online (Sandbox Code Playgroud)
以下是调用的异常和堆栈跟踪RunSynchronously
:
System.InvalidOperationException
消息:可能无法在未绑定到委托的任务上调用RunSynchronously.
InnerException:null
资料来源:mscorlib …
我的单例访问器方法通常是以下的一些变体:
static MyClass *gInstance = NULL;
+ (MyClass *)instance
{
@synchronized(self)
{
if (gInstance == NULL)
gInstance = [[self alloc] init];
}
return(gInstance);
}
Run Code Online (Sandbox Code Playgroud)
我可以做些什么来改善这个?
我知道之前已经问过这个问题,但大部分时间都会询问与特定数据库或表格有关的问题.我无法在这个网站上找到描述两个引擎及其差异的答案,而不考虑某些特定数据库.
我希望将来能够在设计表或数据库时做出更明智的决策,所以我正在寻找关于两个存储引擎之间差异的全面答案.
我的要求是:
其他信息:
选项:
使用StringValue1,StringValue2创建一个大表... IntValue1,IntValue2,...等我讨厌这个想法,但如果有人能告诉我它比其他想法更好,为什么会考虑它.
创建一个动态表,根据需要按需添加新列.我也不喜欢这个想法,因为除非你索引每一列,否则我觉得性能会很慢.
创建一个包含UDFName,UDFDataType和Value的表.添加新的UDF时,生成一个View,它只提取该数据并将其解析为指定的任何类型.不符合解析标准的项返回NULL.
创建多个UDF表,每种数据类型一个.所以我们有UDFStrings,UDFDates等的表.可能和#2一样,并且只要添加新字段就自动生成View
XML数据类型?我之前没有使用过这些,但已经看过它们了.不确定他们是否会给我我想要的结果,尤其是性能.
别的什么?
我有一个ItemsControl
数据列表,我想虚拟化,但VirtualizingStackPanel.IsVirtualizing="True"
似乎不适用于ItemsControl
.
这是真的吗,还是有另一种方法可以做到这一点,我不知道?
要测试我一直在使用以下代码块:
<ItemsControl ItemsSource="{Binding Path=AccountViews.Tables[0]}"
VirtualizingStackPanel.IsVirtualizing="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Initialized="TextBlock_Initialized"
Margin="5,50,5,50" Text="{Binding Path=Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
如果我将其更改ItemsControl
为a ListBox
,我可以看到该Initialized
事件只运行了几次(巨大的边距只是因此我只需要通过一些记录),但是ItemsControl
每个项目都会被初始化.
我试过设置ItemsControlPanelTemplate
为a VirtualizingStackPanel
但似乎没有帮助.
很多时候,多个面板适合我想要的布局,但我知道不同面板类型的渲染时间有所不同.
例如,MSDN声明
相对简单
Panel
,例如Canvas
,可以具有比更复杂的更好的性能Panel
,例如Grid
.
那么在渲染时间和性能方面,WPF面板的最高效率是多少?
WPF小组:
Canvas
DockPanel
Grid
UniformGrid
StackPanel
WrapPanel
VirtualizingPanel
/VirtualizingStackPanel
我很确定我在网上看到了这个列表,但我现在找不到它.
我正在寻找的理想答案将为我提供一个面板列表,按照他们最快速渲染的顺序.我知道儿童的数量是面板效率的一个重要因素,因此为了这个问题,假设每个面板只有一对Label
/ TextBox
一对.
此外,我想要一个例外列表,例如特定面板,它们在某些条件下比其他面板表现更好.
更新
总结基于下面接受的答案,面板性能基于子项的数量和布局,但一般来说,从最快到最慢的列表是:
Canvas
StackPanel
WrapPanel
DockPanel
Grid
此外,如果有许多项目并不总是适合屏幕,则应始终使用VirtualizingPanel
/ VirtualizingStackPanel
.
在强烈选择此列表中的项目之前,我强烈建议您阅读下面接受的答案以获取更多详细信息.
有人可以快速总结一下ViewModelLocator是什么,它是如何工作的,以及与DataTemplates相比使用它的优缺点是什么?
我曾尝试在Google上查找信息,但似乎有许多不同的实现,并没有关于它是什么以及使用它的优点/缺点的严格列表.
简短的问题
我有一个运行180,000次的循环.在每次迭代结束时,它应该将结果附加到TextBox,TextBox是实时更新的.
使用MyTextBox.Text += someValue
导致应用程序占用大量内存,并且在几千条记录之后它耗尽了可用内存.
是否有更有效的方式将文本附加到TextBox.Text
180,000次?
编辑我真的不关心这个特定情况的结果,但我想知道为什么这似乎是一个记忆猪,并且如果有一种更有效的方法将文本附加到TextBox.
长(原始)问题
我有一个小应用程序,它读取CSV文件中的ID号列表,并为每个应用程序生成PDF报告.生成每个pdf文件后,ResultsTextBox.Text
将附加到已处理的报告的ID号以及已成功处理的报告的ID号.该进程在后台线程上运行,因此ResultsTextBox会在项处理时实时更新
我目前正在针对180,000个ID号运行该应用程序,但是应用程序占用的内存随着时间的推移呈指数级增长.它从大约90K开始,但是大约3000条记录占用大约250MB,而4000条记录占用大约500 MB的内存.
如果我注释掉结果文本框的更新,内存保持相对静止大约90K,所以我可以假设写作ResultsText.Text += someValue
是导致它吃内存的原因.
我的问题是,这是为什么?将数据附加到不吃内存的TextBox.Text的更好方法是什么?
我的代码看起来像这样:
try
{
report.SetParameterValue("Id", id);
report.ExportToDisk(ExportFormatType.PortableDocFormat,
string.Format(@"{0}\{1}.pdf", new object[] { outputLocation, id}));
// ResultsText.Text += string.Format("Exported {0}\r\n", id);
}
catch (Exception ex)
{
ErrorsText.Text += string.Format("Failed to export {0}: {1}\r\n",
new object[] { id, ex.Message });
}
Run Code Online (Sandbox Code Playgroud)
还应该值得一提的是,该应用程序是一次性的事情,并不需要花费几个小时(或几天:)来生成所有报告.我主要担心的是,如果它达到系统内存限制,它将停止运行.
我没关系更新结果TextBox注释掉来运行这个东西,但我想知道是否有一种更有效的内存方式将数据附加到TextBox.Text
未来的项目中.
我们的团队对此有所分歧,我希望得到一些第三方意见.
我们正在构建一个应用程序,无法决定是否要将.Net WPF桌面应用程序与WCF服务器或使用jQuery的ASP.Net Web应用程序一起使用.我想我会在这里提出一些问题,并提出一些规格,看看使用任何一方的利弊是什么.我有自己的最爱,觉得我有偏见.
理想情况下,我们希望尽可能快地构建软件的初始版本,然后放慢速度并花时间构建我们以后想要的其他功能/组件.最重要的是我们希望软件快速.用户整天都会查看记录,加载记录或刷新屏幕的延迟会影响他们的工作效率.
申请细节:
要考虑的项目(可能最初在某些情况下,但在将来的版本中):
我们的开发人员:
环境:
基于此,你会选择什么,为什么?
我特别感兴趣的是那些有ASP.Net和WPf经验的开发人员.
我想知道是否存在在string.Format中格式化NULL值的语法,例如Excel使用的语法
例如,使用Excel我可以指定格式值{0:#,000.00;-#,000.00,NULL}
,这意味着如果为正数则将数值显示为数字格式,如果为负数则显示在括号中的数字格式,如果值为null则显示为NULL
string.Format("${0:#,000.00;(#,000.00);NULL}", someNumericValue);
Run Code Online (Sandbox Code Playgroud)
编辑
我正在寻找所有数据类型的格式NULL
/ Nothing
值,而不仅仅是数字类型.
我的例子实际上是不正确的,因为我错误地认为Excel使用第3个参数,如果值为NULL,但它实际上在值为0时使用.我将它留在那里因为它是我能想到的最接近我的东西希望能做到.
我希望避免使用null合并操作符,因为我正在编写日志记录,并且数据通常不是字符串
写一些类似的东西要容易得多
Log(string.Format("Value1 changes from {0:NULL} to {1:NULL}",
new object[] { oldObject.SomeValue, newObject.SomeValue }));
Run Code Online (Sandbox Code Playgroud)
而不是写
var old = (oldObject.SomeValue == null ? "null" : oldObject.SomeValue.ToString());
var new = (newObject.SomeValue == null ? "null" : newObject.SomeValue.ToString());
Log(string.Format("Value1 changes from {0} to {1}",
new object[] { old, new }));
Run Code Online (Sandbox Code Playgroud) wpf ×5
c# ×3
database ×2
asp.net ×1
async-await ×1
asynchronous ×1
c#-5.0 ×1
datatemplate ×1
innodb ×1
itemscontrol ×1
mvvm ×1
mvvm-light ×1
myisam ×1
mysql ×1
objective-c ×1
panel ×1
performance ×1
rendering ×1
singleton ×1
sql ×1