我正在学习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 …
具体来说,我正在尝试这段代码:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
Run Code Online (Sandbox Code Playgroud)
但它给出了错误
无法访问静态方法main中的非静态字段
所以我把声明改为clock
:
static Clock clock = new Clock();
Run Code Online (Sandbox Code Playgroud)
它奏效了.在声明之前放置该关键字是什么意思?对于该对象可以做什么,它究竟会做什么和/或限制什么?
我有一个ArrayList
我想完全输出为String.基本上我想按顺序输出它,使用toString
由制表符分隔的每个元素.有没有快速的方法来做到这一点?你可以循环它(或删除每个元素)并将它连接到一个字符串,但我认为这将是非常缓慢的.
我最近一直在考虑定义数组的两种方法之间的区别:
int[] array
int array[]
有区别吗?
在C#/.NET TimeSpan
有TotalDays
,TotalMinutes
等等,但我无法弄清楚总月差的公式.每月可变天数和闰年一直让我失望.我如何获得TotalMonths?
编辑抱歉没有更清楚:我知道我实际上无法得到这个,TimeSpan
但我想使用TotalDays
,TotalMinutes
并将是一个很好的例子来表达我正在寻找...除了我想要得到总月.
示例:2009年12月25日 - 2009年10月6日= 2 TotalMonths.10月6日至11月5日等于0个月.11月6日,1个月.12月6日,2个月
我正在阅读Bill Wagner的Effective C#.在第14项 - 最小化重复初始化逻辑中,他显示了以下在构造函数中使用新的可选参数功能的示例:
public MyClass(int initialCount = 0, string name = "")
请注意,他使用""
而不是string.Empty
.
他评论道:
您将注意到[在上面的示例中]第二个构造函数为name参数指定了默认值,而不是更常用的
string.Empty
.那是因为string.Empty
它不是编译时常量.它是字符串类中定义的静态属性.因为它不是编译常量,所以不能将它用作参数的默认值.
如果我们不能string.Empty
在所有情况下使用静态,那么这不是打败了它的目的吗?我认为我们会用它来确保我们有一个独立于系统的方法来引用空字符串.我的理解错了吗?谢谢.
更新
只是后续评论.根据MSDN:
每个可选参数都有一个默认值作为其定义的一部分.如果没有为该参数发送参数,则使用默认值.默认值必须是常量.
然后我们无法使用它们System.Environment.NewLine
,或者使用新实例化的对象作为默认值.我还没有用过VS2010,这太令人失望了!
简短的问题
我有一个运行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
未来的项目中.
如果我声明这个数组......
string[,] a = {
{"0", "1", "2"},
{"0", "1", "2"},
{"0", "1", "2"},
{"0", "1", "2"},
};
Run Code Online (Sandbox Code Playgroud)
然后我可以测量长度
a.Length
Run Code Online (Sandbox Code Playgroud)
这是12.如何测量阵列的尺寸?如果我试试......
a[0].Length
Run Code Online (Sandbox Code Playgroud)
我得到Wrong number of indices inside []; expected 2
.是什么赋予了?
我已经观察了一段时间C#程序员倾向于在任何地方使用int,并且很少使用uint.但我从来没有找到一个令人满意的答案为什么.
如果您的目标是互操作性,则uint不应出现在公共API中,因为并非所有CLI语言都支持无符号整数.但这并不能解释为什么int如此普遍,即使在内部课程中也是如此.我怀疑这是因为在BCL中谨慎使用uint的原因.
在C++中,如果你有一个负值没有意义的整数,你选择一个无符号整数.
这清楚地表明不允许或不期望负数,编译器会为您做一些检查.我还怀疑在数组索引的情况下,JIT可以轻松地删除下限检查.
但是,在混合int和单位类型时,需要额外的护理和演员表.
是否应该使用更多?为什么?
我想知道一些代码块执行了多长时间.像这样的东西:
startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);
Run Code Online (Sandbox Code Playgroud)
怎么样?