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