Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.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# 如何在接口中使用wait-on方法_C#_.net 4.5_Async Await - Fatal编程技术网

C# 如何在接口中使用wait-on方法

C# 如何在接口中使用wait-on方法,c#,.net-4.5,async-await,C#,.net 4.5,Async Await,在使用await关键字对接口(由于模拟、远程处理或类似)实施时,如果接口具有返回任务的方法: 接口IFoo { 任务计算能力(int值); } 编译器出现一个错误: “await”运算符只能在异步方法中使用。考虑将该方法标记为“AsiNC”修饰符并将其返回类型改为“任务”< /P> 考虑到返回类型是“任务”,这有点不寻常。这个问题有点令人沮丧,迫使我使用延续样式或在这个接口周围提供一个额外的代理来“后退”(因此对于几乎每一个对我来说并不真正可行的接口) 有人知道如何解决这个问题吗?这一定没问题

在使用await关键字对接口(由于模拟、远程处理或类似)实施时,如果接口具有返回任务的方法:

接口IFoo
{
任务计算能力(int值);
}
编译器出现一个错误:

“await”运算符只能在异步方法中使用。考虑将该方法标记为“AsiNC”修饰符并将其返回类型改为“任务”< /P> 考虑到返回类型是“任务”,这有点不寻常。这个问题有点令人沮丧,迫使我使用延续样式或在这个接口周围提供一个额外的代理来“后退”(因此对于几乎每一个对我来说并不真正可行的接口)

有人知道如何解决这个问题吗?

这一定没问题:

interface IFoo
{
    Task<BigInteger> CalculateFaculty(int value);
}

public class Foo: IFoo
{
  public async Task<BigInteger> CalculateFaculty(int value)
  {
    var res =  await AsyncCall();
    return res;
  }
}

消息不是关于接口的,而是关于调用方法的。您需要使用
async
修饰符标记包含
wait
关键字的方法:

public interface IFoo
{
    Task<int> AwaitableMethod();
}

class Bar
{
    static async Task AsyncMethod() // marked as async!
    {
        IFoo x;
        await x.AwaitableMethod();
    }
}
公共接口IFoo
{
任务等待方法();
}
分类栏
{
静态异步任务AsyncMethod()//标记为异步!
{
ifoox;
wait x.AwaitableMethod();
}
}

编译器消息与接口上的用法无关。它是对任务的异步请求,当在操作中遇到适当的等待时,由运行时实现


应在方法实现上使用,即类;接口的用法与接口中setter和getter的用法相同。

给出错误的代码是什么?当然不是接口声明…可能重复的同时,我扩展了我的异步/等待知识“一点”,这里要理解的关键是:“等待”是一个编译器工具,它要求编译器将以“同步”编写的方法重写为“异步回调”样式。“async”只是标记了一个方法,允许它包含“await”(加上处理返回值)。因此,关键字在纯方法签名(没有主体的方法)上没有意义,就像在接口定义中一样,因为编译器没有什么可重写的。同样:从调用方的角度来看,异步/等待是不相关的。返回任务很重要。这似乎是他们应该解决的问题。为什么接口不明确指定实现不应该是异步的?接口只是一个签名列表。如果它影响您调用方法的方式(它在具体方法中就是这样做的),接口应该知道它。当一个纯粹主义者违背常识的时候,这似乎就是其中之一。我真丢脸。你是完全正确的,错误很清楚地说明了错在哪里。我只是在接口方法的上下文中不断误读它,而不是在调用接口方法的方法中。非常感谢。这不是一个很好的例子,因为
Main()
不能是
async
。从技术上讲,它只是另一个静态方法,所以可以是异步的(我编写并编译的代码)。当然你是对的,这没有多大意义。更新了我的答案…我只是好奇:那么将方法重命名为CalculateFacultyAsync不是更好吗?我不熟悉Async/Await,根据MSDN,名称应该表示异步行为。有不同的选项。
 public async Task DoSomething(IFoo foo) 
 { 
   var result = await foo.CalculateFaculty(123); 
 }
public interface IFoo
{
    Task<int> AwaitableMethod();
}

class Bar
{
    static async Task AsyncMethod() // marked as async!
    {
        IFoo x;
        await x.AwaitableMethod();
    }
}