加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 00:21:29 所属栏目:百科 来源:网络整理
导读:我正在编写一个使用第三方库来处理某些数据的应用程序.在一个非常简单的例子中,我有一个像这样的任务运行的方法: private void ProcessListOfItems(Liststring items){ while (items.Count 0) { 3rdPartyLibObject.Process(items[0]); items.Remove(0); }}
我正在编写一个使用第三方库来处理某些数据的应用程序.在一个非常简单的例子中,我有一个像这样的任务运行的方法:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读