瞬时代码被延迟了吗?任务使用正确吗?

时间:2019-03-06 08:37:47

标签: c# asynchronous uwp async-await task

所以我完成了一些编码,但是我不理解所发生的一些结果。我将在这里尝试编写一些乱码,这些代码与我的真实代码非常相似。如果这些信息很重要:这是一个UWP应用。

我将使用的一种名为textBlockTextMethod()的方法是一种带有一堆ifif-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我虽然在冻结期间可以看到它。但是像这样,感觉aMethodStart设置为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
}

我在这里的问题:我的解决方案是否正确使用?。但这是因为我在这里很幸运并且仅在某些情况下有效吗?还是使用Taskasyncawait的常用方法?

1 个答案:

答案 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