gpt4 book ai didi

c# - 阻止代码并等待事件处理程序触发?

转载 作者:行者123 更新时间:2023-11-30 13:23:20 26 4
gpt4 key购买 nike

我正在编写一个使用第 3 方库来处理某些数据的应用程序。在一个非常简化的示例中,我有一个方法作为这样的任务运行:

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 的异步/等待支持以使整个事情异步。

关于c# - 阻止代码并等待事件处理程序触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com