我有一个来自第三方SDK的对象数据库。它们提供了一种基于事件的搜索方法。我希望搜索事物,并且只在搜索完成后返回结果。这是我正在使用的伪代码:
Class SearchThings
{
private Object DatabaseOfDifferentThings;
private List<Thing> _objects = null;
private SearchSession _search = null;
private bool _initialized = false;
public SearchThings()
{
}
Public List<thing> GetFoundThings()
{
if (_initialized == false)
{
StartSearch();
}
return _objects;
}
private void StartSearch()
{
_objects = new List<Thing>();
_search = DatabaseOfDifferentThings("TypeOfThingToSearchFor");
_search.ThingAvailable += OnThingAvailable;
_search.Progress += OnProgress;
_search.StartSearch();
}
private void OnThingAvailable(Thing thing)
{
_objects.Add(thing);
}
private void OnProgress(int progress)
{
if (progress == 100)
{
_search.StopSearch();
_search -= OnProgress;
_search -= OnThingAvailable;
_initialized = true;
}
}
}
我的意图是,只有当List被完全填充和初始化时,才从GetFoundThings((返回。由于搜索机制订阅事件来填充列表,我不确定如何使用异步等待或其他机制来";暂停";同时正在收集对象。
如有任何帮助,我们将不胜感激。
您可以使用TaskCompletionSource。
用法示例:
private TaskCompletionSource<object> _tcs = new TaskCompletionSource<object>();
更改StartSearch
以返回Task
private Task StartSearch()
{
_objects = new List<Thing>();
_search = DatabaseOfDifferentThings("TypeOfThingToSearchFor");
_search.ThingAvailable += OnThingAvailable;
_search.Progress += OnProgress;
_search.StartSearch();
return _tcs.Task; // return Task that represents future work
}
然后在您的OnProgress
中,当它达到100
时,您可以完成Task
private void OnProgress(int progress)
{
if (progress == 100)
{
_search.StopSearch();
_search -= OnProgress;
_search -= OnThingAvailable;
_initialized = true;
_tcs.SetResult(null);
}
}
然后你可以这样称呼它:
public async Task<List<Thing>> GetFoundThings()
{
if (_initialized == false)
{
await StartSearch();
}
return _objects;
}