- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我看到一些关于设计自定义等待类型的文章:
http://books.google.com.br/books?id=1On1glEbTfIC&pg=PA83&lpg=PA83&dq=create+a+custom+awaitable+type
现在考虑下面的例子:
<Button x:Name="BtnA"
Width="75"
Margin="171,128,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="BtnA_Click"
Content="Button A" />
<Button x:Name="BtnB"
Width="75"
Margin="273,128,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Content="Button B" Click="BtnB_OnClick" />
和:
private async void BtnA_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Awaiting Button B..");
var sx = Observable.FromEvent<MouseButtonEventHandler,
MouseButtonEventArgs>(a => (b, c) => a(c),
add => BtnB.PreviewMouseDown += add,
rem => BtnB.PreviewMouseDown -= rem)
.Do(a => a.Handled = true)
.Take(1);
await sx;
MessageBox.Show("Button B Pressed after Button A");
}
private void BtnB_OnClick(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button B Pressed Without Click in Button A");
}
为什么我可以await IObservable<T>
(在这种情况下订阅完成时),如果没有 GetAwaiter()
方法?
是编译器实现的吗?是否有可能实现可以 await
的东西不明确此方法(某些场景正在使用哪些接口(interface))?为什么没有这样的东西:
public interface ITask<out T>
{
IAwaiter<T> GetAwaiter();
}
public interface IAwaiter<out T> : ICriticalNotifyCompletion
{
bool IsCompleted { get; }
T GetResult();
}
...或创建自定义可等待的真实界面?
最佳答案
你不能await
东西没有GetAwaiter
返回具有 GetResult
的东西的方法, OnCompleted
, IsCompleted
并实现 INotifyCompletion
.
await
一个IObservable<T>
?除了实例方法之外,编译器还接受 GetAwaiter
扩展方法。在这种情况下,Reactive Extensions 的 Observable
提供该扩展:
public static AsyncSubject<TSource> GetAwaiter<TSource>(this IObservable<TSource> source);
例如,这就是我们如何使字符串可等待(编译但显然不会实际工作):
public static Awaiter GetAwaiter(this string s)
{
throw new NotImplementedException();
}
public abstract class Awaiter : INotifyCompletion
{
public abstract bool IsCompleted { get; }
public abstract void GetResult();
public abstract void OnCompleted(Action continuation);
}
await "bar";
关于c# - 如果没有 GetAwaiter 方法,我可以 await 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046775/
我在 C# 中有这个 xUnit 方法,它测试一个 web api [Fact] public async Task GetWeatherForecast() {
这个问题在这里已经有了答案: Calling async methods from non-async code (4 个答案) 关闭 3 年前。 我有一个需要同步调用的异步任务(是的,不幸的是,这
它说 here : Async methods can have the following return types: Task, for an async method that performs
在 .net 4.0 中,我经常使用 Task.ContinueWith。但随后 I spotted "task.GetAwaiter()"这似乎具有相同的目的。 有什么不同? 最佳答案 如果你的目标
下面我粘贴了一些代码。在正文的第一行,我调用了一个等待调用 Task> GetSkuGcnList();最后一行,在 mapPromise.GetAwaiter() 中获取结果时抛出此异常: An e
我在使用下面的一组代码时遇到以下错误,它在“alliancelookup”行上出错,我不确定我做错了什么,但我自己看不到任何东西。我运行到 crest 的查询似乎运行良好,但我遇到的问题似乎与 Awa
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我在 Entity Framework 中使用 WebAPI 来创建新端点,但我遇到了一些问题。我正在尝试使用 Linq Where 语句来获取我的数据,但我收到以下错误。 'IQueryable'
我遇到了多个错误。因为我是这个异步/等待过程的新手。因此,我几乎没有做任何研究:- 我有一个像这样的函数:- public async Task GetMultipleTblResult(AdminB
我正在试验任务。我有 private async Task GetStringWithInnerCallConfigureAwaitFalseAsync() { await Task.Dela
我正在尝试为我的一个项目寻找最佳实践。它是一个典型的 WPF 应用程序,具有显示项目列表的 UI 和返回结果的数据服务。 我们正在异步调用服务,以免阻塞 UI。我们面前有 2 个选择: 使用 Asyn
我在一些地方读到 .GetAwaiter().GetResult(); 可能导致死锁,我们应该使用 async/await 相反。但是我看到很多使用它的代码示例。可以用吗?在哪些情况下会出现死锁?还有
客户端 iGame Channel = new ChannelFactory ( new BasicHttpBinding ( BasicHttpSecurityMode . None ) , new
假设我有一个 Task 生成 int ,以及接受 int 的回调: Task task = ...; Action f = ...; 现在我想设置它,以便一旦任务完成并返回其整数结果,callfack
我正在尝试为我的一个项目找到最佳实践。它是一个典型的 WPF 应用程序,其 UI 显示项目列表,并且有一个返回结果的数据服务。 我们异步调用服务,以免阻塞 UI。我们面前有两个选择: 使用 Async
我正在尝试同步运行异步任务,并且想知道 .RunSynchronously() 之间有什么区别和GetAwaiter().GetResult()是。 我见过很多 .Wait() 之间的比较以及这两种方
早上好,这是我在社区中的第一个问题。我正在使用 C# WebAPI 框架,我正在尝试将所有 Controller 的方法更改为异步方法。我的 Controller 从 GenericControlle
我有这个代码: async function test() { var mongo = await MongoClient.connect(connectionString); var
这个问题在这里已经有了答案: UWP app: FileOpenPicker PickSingleFileAsync() can't await (1 个回答) 关闭 5 年前。 我正在构建一个 U
我有一个返回对象列表<>的方法。此方法需要一段时间才能运行。 private List GetBigList() { ... slow stuff } 此方法从 4 或 5 个来源调用。所以,
我是一名优秀的程序员,十分优秀!