Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待在堆栈上深度嵌套的方法_C#_Wpf_C# 4.0_Async Await - Fatal编程技术网

C# 等待在堆栈上深度嵌套的方法

C# 等待在堆栈上深度嵌套的方法,c#,wpf,c#-4.0,async-await,C#,Wpf,C# 4.0,Async Await,假设在某一点上,至少有10个方法在堆栈中作为未完成的方法可用。这些方法中的许多都处理对UI产生影响的操作。此时,我想发出一个Save命令。Save命令可以成功完成,也可以失败。根据结果,我希望执行不同的操作,然后才将执行返回给堆栈上剩下的那些方法 现在,如果我同步运行Save命令,就不会有问题了。我希望异步执行Save命令,将执行返回到消息泵(UI),而堆栈上的所有代码(方法)都应该等待SaveCommand完成 现在,正如我所理解的wait,不能保证在同一个线程(在我的例子中是UI线程)上进行

假设在某一点上,至少有10个方法在堆栈中作为未完成的方法可用。这些方法中的许多都处理对UI产生影响的操作。此时,我想发出一个Save命令。Save命令可以成功完成,也可以失败。根据结果,我希望执行不同的操作,然后才将执行返回给堆栈上剩下的那些方法

现在,如果我同步运行Save命令,就不会有问题了。我希望异步执行Save命令,将执行返回到消息泵(UI),而堆栈上的所有代码(方法)都应该等待SaveCommand完成

现在,正如我所理解的wait,不能保证在同一个线程(在我的例子中是UI线程)上进行调用。所以,我不能等待调用的第一个方法(堆栈中所有其他方法的父方法),因为如果启动了不同的线程,它将引发UI异常(从不同的线程访问UI元素)

那么,如何处理这种情况呢?示例代码:

public bool PropertyName {get; set { MethodA(); // some code after  };}
public void MethodB() { MethodC(); // some code after  } 
public void MethodC() { MethodD(); // some code after  } 
public void MethodD() { MethodE(); // some code after  } 
// etc

void MEthodK()
{
    Save();
}

除非调用
ConfigureAwait()
await
从UI线程调用
任务将始终在UI线程上继续运行代码。

您不必担心。

除非调用
ConfigureAwait()
await
从UI线程调用
任务将始终恢复在UI线程上运行代码。
您不必担心它。

如果您想(异步)等待一个方法,只需等待该方法返回的
任务即可:

public async Task MethodCAsync() { await MethodDAsync(); // some code after  } 
public async Task MethodDAsync() { await MethodEAsync(); // some code after  } 
async Task MethodKAsync()
{
  await Save();
}
这将导致属性设置程序出现问题,该设置程序现在必须是异步方法:

public bool PropertyName { get; private set; }
public async Task SetPropertyNameAsync() { await MethodAAsync(); // some code after }
如果要(异步)等待某个方法,只需等待该方法返回的任务即可:

public async Task MethodCAsync() { await MethodDAsync(); // some code after  } 
public async Task MethodDAsync() { await MethodEAsync(); // some code after  } 
async Task MethodKAsync()
{
  await Save();
}
这将导致属性设置程序出现问题,该设置程序现在必须是异步方法:

public bool PropertyName { get; private set; }
public async Task SetPropertyNameAsync() { await MethodAAsync(); // some code after }

您可能应该告诉我们您使用的语言/框架/等我已经更新了问题。这些方法不一定非得是方法,它们可以是函数,只是为了清楚起见,它是无效的。你应该告诉我们你使用的语言/框架/等等我已经更新了这个问题。这些方法不一定非得是方法,它们可以是函数,为了清楚起见,这是无效的。那么,在我刚刚添加的代码中,您对正确的方法有什么建议(运行MethodK而不阻塞UI线程,并强制所有其他方法(A-K)等待保存完成?)?@Goran:让所有这些方法
异步
,并且
在你调用它们时等待它们。那么,在我刚刚添加的代码中,你对正确的方法有什么建议(在不阻塞UI线程的情况下运行MethodK,并强制所有其他方法(A-K)等待保存完成?)?@Goran:让所有这些方法
异步
,并且
在你调用它们时等待它们。所以,你的建议是等待所有方法,尽管我只需要等待一个?这是我的第一个想法,但这个想法本身让我退后了一步。这实际上意味着我的大多数方法都是异步的。。。我希望会有一种awaitX方法,它会立即将控制权返回给消息泵,而不是前一个调用者,当任务被标记为已完成时,泵会在await关键字之后立即返回执行。@Goran这就是它的作用,我理解async await的工作原理,但我不喜欢它无处不在的想法。是否存在一些性能问题?有其他选择吗?@Goran:
async
一直使用调用堆栈是
async
的工作方式。没有任何真正的性能问题。备选方案包括任何其他类型的方法,但所有其他模式都要复杂得多,仍然需要您以比使它们
异步
更剧烈的方式更改调用堆栈中的每个方法。因此,您的建议是等待所有方法,尽管我只需要等待一个?这是我的第一个想法,但这个想法本身让我退后了一步。这实际上意味着我的大多数方法都是异步的。。。我希望会有一种awaitX方法,它会立即将控制权返回给消息泵,而不是前一个调用者,当任务被标记为已完成时,泵会在await关键字之后立即返回执行。@Goran这就是它的作用,我理解async await的工作原理,但我不喜欢它无处不在的想法。是否存在一些性能问题?有其他选择吗?@Goran:
async
一直使用调用堆栈是
async
的工作方式。没有任何真正的性能问题。替代方法包括任何其他类型的,但所有其他模式都要复杂得多,并且仍然需要您以比使它们
异步
更剧烈的方式更改调用堆栈中的每个方法。