C# 在C语言中,如何知道外部服务何时完成回调?

C# 在C语言中,如何知道外部服务何时完成回调?,c#,asynchronous,callback,service-reference,C#,Asynchronous,Callback,Service Reference,我在.NET控制台应用程序中有一个外部引用,它为我在大字符串上执行一些语言翻译 在一个循环中,我给服务打了很多电话。总共大概有5000-8000个电话 该服务要求我实现一个回调函数,以便在工作完成时将翻译后的字符串返回给我。在继承TranslationService接口的另一个类中,我实现了它们的回调函数: class MyTranslationServiceCallback : TranslationService.ITranslationServiceCallback { publi

我在.NET控制台应用程序中有一个外部引用,它为我在大字符串上执行一些语言翻译

在一个循环中,我给服务打了很多电话。总共大概有5000-8000个电话

该服务要求我实现一个回调函数,以便在工作完成时将翻译后的字符串返回给我。在继承TranslationService接口的另一个类中,我实现了它们的回调函数:

class MyTranslationServiceCallback : TranslationService.ITranslationServiceCallback
{
    public void TranslateTextCallback(string sourceContent, string responseContent)
    {
        UpdateMyDatabase(responseContent);
    }
}
调试时,我在Main的最后添加了Console.Readkey,以防止应用程序关闭,从而完成所有回调。到目前为止,我只是假设当它停止进入回调函数一分钟左右,它就完成了,我知道,这是不好的

所以它看起来像:

class Program
{
    static void Main(string[] args)
    {
        foreach (var item in itemList)
        {
            TranslationService.TranslateText(item.EnglishText, "french");
        }

        Console.Readkey()
    }
}

确定是否已完成所有回调的正确方法是什么?

为什么不使用.NET内置的异步框架?您只需启动任务并在数组中跟踪它们,然后可以调用Task.whell来阻止程序,直到所有任务完成

注意:我正在使用NuGet包,以便从控制台应用程序运行异步代码

class Program
    {
      static int Main(string[] args)
      {
        return AsynContent.Run(() => MainAsync(args));
      }

      static async Task<int> MainAsync(string[] args)
      {
        var taskList = new List<Task>();

        foreach (var item in itemList)
        {
          Task.Factory.StartNew(() => TranslationService.TranslateText(item.EnglishText, "french");
        }

        Task.WhenAll(taskList.ToArray());
      }
}

由于翻译服务无法告知翻译的状态,因此您需要跟踪所拨打的电话和回拨。创建一个单例,每个调用都有一个计数器和增量。减少每次回拨的次数

如果您在.NET中实现此功能,那么async/await就是您的朋友

如果TranslationService不是通过回调返回结果,而是返回一个任务,那就太好了

然后您可以实现以下功能:

static async Task TranslateAllItems(IEnumerable<Item> list)
{
     foreach(var item in itemList)
     {
         string result = await TranslationService.TranslateText(item.EnglishText, "french");
         UpdateMyDatabase(item.EnglishText, content);
     }
}

static void Main(string[] args)
{
    Task task = TranslateAllItems(itemList);
    task.Wait();
    Console.ReadKey();
}
上述解决方案将按顺序执行每个翻译,等待一个翻译任务完成后再开始下一个翻译任务

如果启动所有翻译更快,请等待整个批处理完成:

static Task TranslateAllItems(IEnumerable<Item> list)
{
     List<Task> waitingTasks = new List<Task>();
     foreach(var item in itemList)
     {
          string englishText = item.EnglishText;
          var task = TranslationService.TranslateText(englishText , "french")
              .ContinueWith(taskResult => UpdateMyDatabase(englishText, taskResult.Result);
          waitingTasks.Add(task);
     }
     return Task.WhenAll(waitingTasks);
 }

翻译服务是否没有告知状态?如果没有,您可以计算您拨打的电话和回拨的次数。@Vijayakrishna不,这是一项相对较新的内部服务。翻译服务不跟踪任何内容,只在回调函数中返回源字符串和翻译后的字符串。