事件完成的任务
Task that completes on event
我正在尝试编写一个 returns 任务的 C# 方法。该任务应该注册到另一个对象(我没有写也没有控制)上的事件,并在事件被触发时完成。事件参数包含任务的结果。
我尝试了以下想法(这是不好的...):
public Task<int> GetValue(ObjectToWaitFor waitFor)
{
var flag = false;
int value = -1;
return Task.Factory.StartNew<int>(() =>
{
waitFor.TheEvent += (s, e) =>
{
value = e.Value;
flag = true;
};
while (!flag)
{
Task.Delay(100).Wait();
}
return value;
});
}
使用在事件处理程序上设置为 true 的标志,然后让任务循环直到标志设置为 true。但这似乎不是一个优雅的解决方案,我想知道是否有更好的方法。
我怀疑您正在寻找 TaskCompletionSource<TResult>
。基本上,您创建其中一个(并记住它),然后交回它在 Task
属性.
中提供的任务
当事件被触发时,在完成源上设置适当的result/fault,就大功告成了。
扩展@jonskeet 的回答:
void Main()
{
var foo = new Foo();
//type parameter here defines the type of the Task
//so here, we're expecting to make a Task<int>
var tcs = new TaskCompletionSource<int>();
foo.Evt += (sender, eventArgs) => {
tcs.SetResult(0);
//or tcs.SetException(someException);
//etc...
};
//here's your task, ready to go.
Task<int> task = tcs.Task;
}
class Foo
{
public event EventHandler Evt;
}
我正在尝试编写一个 returns 任务的 C# 方法。该任务应该注册到另一个对象(我没有写也没有控制)上的事件,并在事件被触发时完成。事件参数包含任务的结果。
我尝试了以下想法(这是不好的...):
public Task<int> GetValue(ObjectToWaitFor waitFor)
{
var flag = false;
int value = -1;
return Task.Factory.StartNew<int>(() =>
{
waitFor.TheEvent += (s, e) =>
{
value = e.Value;
flag = true;
};
while (!flag)
{
Task.Delay(100).Wait();
}
return value;
});
}
使用在事件处理程序上设置为 true 的标志,然后让任务循环直到标志设置为 true。但这似乎不是一个优雅的解决方案,我想知道是否有更好的方法。
我怀疑您正在寻找 TaskCompletionSource<TResult>
。基本上,您创建其中一个(并记住它),然后交回它在 Task
属性.
当事件被触发时,在完成源上设置适当的result/fault,就大功告成了。
扩展@jonskeet 的回答:
void Main()
{
var foo = new Foo();
//type parameter here defines the type of the Task
//so here, we're expecting to make a Task<int>
var tcs = new TaskCompletionSource<int>();
foo.Evt += (sender, eventArgs) => {
tcs.SetResult(0);
//or tcs.SetException(someException);
//etc...
};
//here's your task, ready to go.
Task<int> task = tcs.Task;
}
class Foo
{
public event EventHandler Evt;
}