Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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#_Async Await - Fatal编程技术网

C# 异步/等待模式。如何将等待的方法传递给另一个方法

C# 异步/等待模式。如何将等待的方法传递给另一个方法,c#,async-await,C#,Async Await,在我的应用程序中,我需要在所有API请求之前调用一个方法。如果满足特定条件,则需要在该方法中执行一组语句 为了推广这一点,我创建了一个类似这样的助手类 public class CertificateValidator { readonly IDependencyService _serviceLocator; public CertificateValidator(IDependencyService serviceLocator) { _serviceLocator = servic

在我的应用程序中,我需要在所有API请求之前调用一个方法。如果满足特定条件,则需要在该方法中执行一组语句

为了推广这一点,我创建了一个类似这样的助手类

public class CertificateValidator {
readonly IDependencyService _serviceLocator;
public CertificateValidator(IDependencyService serviceLocator) {
    _serviceLocator = serviceLocator;
}

public async Task <T> TryExecuteWithCertificateValidationAsync <T> (Task <T> operation) {
    var service = _serviceLocator.Get <IDeviceService> ();
    if (service.CertificateValidationRequired()) {
        // My Code.
    }
    T actualResult = await operation;
    return actualResult;
}
 public CertificateValidator ValidateCertificate => new CertificateValidator(_serviceLocator);

var response = await ValidateCertificate
                            .TryExecuteWithCertificateValidationAsync(MyMethodAsync());

private async Task<RequestResult<Response>> MyMethodAsync()
{
     // Some code
}
public class CertificateValidator{
只读IDependencyService\u serviceLocator;
公共证书评估器(IDependencyService serviceLocator){
_serviceLocator=serviceLocator;
}
公共异步任务TryExecuteWithCertificateValidationAsync(任务操作){
var服务=_serviceLocator.Get();
if(service.CertificateValidationRequired()){
//我的密码。
}
T actualResult=等待操作;
返回实际结果;
}
}

在我的viewmodel中,我做了类似的事情

public class CertificateValidator {
readonly IDependencyService _serviceLocator;
public CertificateValidator(IDependencyService serviceLocator) {
    _serviceLocator = serviceLocator;
}

public async Task <T> TryExecuteWithCertificateValidationAsync <T> (Task <T> operation) {
    var service = _serviceLocator.Get <IDeviceService> ();
    if (service.CertificateValidationRequired()) {
        // My Code.
    }
    T actualResult = await operation;
    return actualResult;
}
 public CertificateValidator ValidateCertificate => new CertificateValidator(_serviceLocator);

var response = await ValidateCertificate
                            .TryExecuteWithCertificateValidationAsync(MyMethodAsync());

private async Task<RequestResult<Response>> MyMethodAsync()
{
     // Some code
}
publiccertificateValidateCertificate=>newCertificateValidator(\u serviceLocator);
var响应=等待ValidateCertificate
.TryExecuteWithCertificateValidationAsync(MyMethodAsync());
专用异步任务MyMethodAsync()
{
//一些代码
}
但是当我像这样实现时,执行流是

  • 将调用第一个MyMethodAsync()

  • 当它到达
    wait
    方法时,它执行 TryExecuteWithCertificateValidationAsync方法并在那里运行剩余的代码

  • 然后当达到
    T actualResult=等待操作时;返回
    实际结果控件返回MyMethodAsync()-await语句
我的怀疑是

我需要完全执行TryExecuteWithCertificateValidationAsync,然后执行MyMethodAsync


简言之,正如我前面所说,在调用所有API调用之前,我需要执行一组代码。如何使用async和await实现类似的功能

而不是传递
任务
传递函数:

public async Task<T> TryExecuteWithCertificateValidationAsync<T>(Func<Task<T>> operation)
{
    var service = _serviceLocator.Get<IDeviceService>();
    if (service.CertificateValidationRequired())
    {
        // My Code.
    }
    T actualResult = await operation();
    return actualResult;
}

var response = await ValidateCertificate
    .TryExecuteWithCertificateValidationAsync(MyMethodAsync);

当我像这样改变时,我得到了以下错误。无法根据用法推断方法“CertificateValidator.TryExecuteWithCertificateValidationAsync(Func)”的类型参数。尝试显式指定类型参数。私有异步任务InvokeUserProfileAsync(AppConfiguration config)这是我尝试调用的方法(在我们的例子中是MyMethodAsync)@Sooraj它肯定是可以推断的;请看这个最小的示例:最后一个疑问,如果我想将一些参数传递给MyMethodAsync(),我如何更改它?私有静态异步任务MyMethodAsync(int i)。对于这个愚蠢的疑问,我感到抱歉。因为我不熟悉这个环境