我正在编写一个使用第三方库来处理一些数据的应用程序。在一个非常简单的示例中,我有一个作为任务运行的方法,如下所示:
private void ProcessListOfItems(List<string> items)
{
while (items.Count > 0)
{
3rdPartyLibObject.Process(items[0]);
items.Remove(0);
}
}
正如您所看到的,按照我当前编写代码的方式,当 Process() 方法返回时,我会立即从列表中删除每个项目。但项目的处理可能会失败,我需要知道是否会发生这种情况。不幸的是,Process() 方法不会返回 bool 值来指示该项目是否已成功处理,而是会触发ProcessingComplete 和ProcessingFailed 事件。我将事件处理程序连接到这些事件,如下所示:
3rdPartyLibObject.ProcessingComplete += obj_ProcessingSuccess;
3rdPartyLibObject.ProcessingFailed += obj_ProcessingFailed;
private void obj_ProcessingSuccess(object sender, 3rdPartyLibObject.ProcessingEventArgs e)
{
this.Invoke(new ProcessedHandler(OnProcessed), new object[] { true });
}
private void obj_ProcessingFailed(object sender, 3rdPartyLibObject.ProcessingEventArgs e)
{
this.Invoke(new ProcessedHandler(OnProcessed), new object[] { false });
}
private void OnProcessed(bool success)
{
if (success)
{
Debug.WriteLine("Item was processed succesfully!");
}
else
{
Debug.WriteLine("Failed to process item!");
}
}
我想做的是让我的代码块在调用 3rdPartyLibObject.Process() 之后,直到事件处理程序之一触发,这样我就知道该项目是否无法处理(以及我是否应该将其从列出或不列出)。我猜这可能不是一个罕见的情况,但我以前从未遇到过。是否有处理这种情况的普遍认可的最佳实践?
就我个人而言,我会将其包装成Task<bool>
,像这样:
Task<bool> Process3rdParty(ThirdPartyLibObject thirdParty, string item)
{
var tcs = new TaskCompletionSource<bool>();
thirdParty.ProcessingComplete += (o, e) => tcs.SetResult(true);
thirdParty.ProcessingFailed += (o, e) => tcs.SetResult(false);
thirdParty.Process(item);
return tcs.Task;
}
然后你可以这样称呼它:
private void ProcessListOfItems(List<string> items)
{
while (items.Count > 0)
{
var task = Process3rdParty(thirdPartyLibObject.Process(items[0]);
if (task.Result)
items.Remove(0);
}
}
如果您稍后决定希望它异步运行或一次处理多个项目(如果第三方库支持此操作),这也会简化事情。迁移到 C# 5 的 async/await 支持以使整个事情异步也非常简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)