所以我完成了一些编码,但是我不理解所发生的一些结果。我将在这里尝试编写一些乱码,这些代码与我的真实代码非常相似。如果这些信息很重要:这是一个UWP应用。
我将使用的一种名为textBlockTextMethod()
的方法是一种带有一堆if
和if-else
语句的方法,这些语句将最终以textBlock.Text
一个新的名称出现文字(在此示例中,始终为"End"
)。
所以首先让我们看一下我的代码的外观:
private void DoSomething()
{
textBlock.Text = "Start";
aIntVal = aMethod(); //aIntVal being a `int` variable
textBlockTextMethod();
}
private int aMethod()
{
int anotherIntVal = 0;
for(int i = 0; i < number; i++)
{
anotherIntVal += randomNum; // randomNum being a random 'int' value
}
return anotherIntVal
}
我对它有什么期望?我希望textBlock.Text
包含文本"Start"
,以便可以在UWP应用中直观地看到Start
。然后aIntVal
应该从int
收到一个aMethod()
值。 aMethod()
大约需要2-3秒才能完成,然后textBlock.Text
应该具有textBlockTextMethod
中的另一个值。
尽管这里发生的是TextBlock
不会显示文本Start
。 UWP应用将冻结2秒,然后我会在End
中设置的UWP应用中看到textBlockTextMethod()
。
为什么会这样,所以我看不到Start
?我虽然在冻结期间可以看到它。但是像这样,感觉aMethod
在Start
设置为textBlock.Text
之前被调用了(或者Start
从未设置为textBlock.Text
)
然后我尝试了不同的方法。这是我第二次尝试使用该代码:
private async void DoSomething()
{
Task<string> aTask = taskMethod()
textBlock.Text = await aTask;
aIntVal = aMethod();
textBlockTextMethod();
}
private async Task<string> taskMethod()
{
textBlock.Text = "Start";
await Task.Delay(1);
return "";
}
private int aMethod()
{
int anotherIntVal = 0;
for(int i = 0; i < number; i++)
{
anotherIntVal += randomNum();
}
return anotherIntVal
}
这使我可以在冻结期间在UWP应用中查看Start
。但这不是很一致。大部分时间我都可以看到Start
。但是有几次我遇到与以前相同的问题,没有显示Start
。
我注意到将Task.Delay(1)
更改为Task.Delay(100)
可以使我Start
保持一致。 为什么会这样?
现在,这是我现在使用的代码的第三次尝试:
private async void DoSomething()
{
textBlock.Text = "Start";
aIntVal = await aMethod();
textBlockTextMethod();
}
private async Task<int> aMethod()
{
int anotherIntVal = 0;
await Task.Run(() =>
{
for(int i = 0; i < number; i++)
{
anotherIntVal += randomNum();
}
});
return anotherIntVal
}
我在这里的问题:我的解决方案是否正确使用?。但这是因为我在这里很幸运并且仅在某些情况下有效吗?还是使用Task
,async
和await
的常用方法?
答案 0 :(得分:3)
如果您要释放 UI 来处理 CPU限制工作负载,则可以执行以下操作
cd ~/.rbenv
git pull
cd ~/.rbenv/plugins/ruby-build/
git pull
其他资源
通过 Stephen Cleary
阅读所有内容从这里Task.Run Etiquette Examples: Don't Use Task.Run in the Implementation