如何在C#中让函数中途暂停,待调用者完成任务后继续执行
在C#类库中实现中途调用外部任务并获取结果的方案
问题场景(翻译后)
我正在编写一个C#类库,这个类库会执行一系列任务,但任务执行到中途时,需要调用者(即使用该类库的应用程序)完成某项任务并返回结果后,才能继续完成函数剩余的任务。我不知道该搜索什么关键词,请问该如何实现这种场景?例如类库中有如下函数:
public bool DoSomething() { SomeWorkToBeDoneByLibrary_1(); SomeWorkToBeDoneByLibrary_2(); SomeWorkToBeDoneByLibrary_3(); // 现在需要调用者完成一项任务并返回结果,类库函数才能继续执行 // 调用者是使用该类库的应用程序 string result = SomeWorkToBeDoneByCaller(); // ***如何实现这一步? SomeWorkToBeDoneByLibrary_4(result); SomeWorkToBeDoneByLibrary_5(result); SomeWorkToBeDoneByLibrary_6(result); return true; }
1. 使用委托(Func)传递调用者逻辑
这是最直接的实现方式,让调用者把需要执行的逻辑以委托形式传给类库方法,类库在需要时执行委托获取结果。
类库代码修改:
public bool DoSomething(Func<string> callerWork) { SomeWorkToBeDoneByLibrary_1(); SomeWorkToBeDoneByLibrary_2(); SomeWorkToBeDoneByLibrary_3(); // 执行调用者传入的逻辑,获取结果 string result = callerWork(); SomeWorkToBeDoneByLibrary_4(result); SomeWorkToBeDoneByLibrary_5(result); SomeWorkToBeDoneByLibrary_6(result); return true; }
调用者使用示例:
var library = new YourLibraryClass(); library.DoSomething(() => { // 这里写调用者需要完成的任务逻辑 Console.WriteLine("调用者执行专属任务"); return "调用者返回的结果"; });
2. 使用回调接口(定义契约)
如果调用者的任务逻辑复杂,可以定义一个接口规范,让调用者实现该接口,类库依赖接口获取结果。
类库中定义接口:
public interface ICallerTaskHandler { string PerformRequiredTask(); }
修改类库方法:
public bool DoSomething(ICallerTaskHandler handler) { SomeWorkToBeDoneByLibrary_1(); SomeWorkToBeDoneByLibrary_2(); SomeWorkToBeDoneByLibrary_3(); string result = handler.PerformRequiredTask(); SomeWorkToBeDoneByLibrary_4(result); SomeWorkToBeDoneByLibrary_5(result); SomeWorkToBeDoneByLibrary_6(result); return true; }
调用者实现并使用:
public class MyCallerHandler : ICallerTaskHandler { public string PerformRequiredTask() { // 调用者的任务逻辑 return "接口方式返回的结果"; } } // 调用类库方法 var handler = new MyCallerHandler(); var library = new YourLibraryClass(); library.DoSomething(handler);
3. 异步场景下使用TaskCompletionSource
如果调用者的任务是异步的(比如等待用户UI操作、网络请求),可以用TaskCompletionSource实现等待调用者完成任务。
类库代码:
public async Task<bool> DoSomethingAsync() { SomeWorkToBeDoneByLibrary_1(); SomeWorkToBeDoneByLibrary_2(); SomeWorkToBeDoneByLibrary_3(); // 创建TaskCompletionSource,等待调用者设置结果 var tcs = new TaskCompletionSource<string>(); // 通过事件通知调用者需要执行任务 OnNeedCallerTask?.Invoke(tcs); // 等待调用者完成任务并返回结果 string result = await tcs.Task; SomeWorkToBeDoneByLibrary_4(result); SomeWorkToBeDoneByLibrary_5(result); SomeWorkToBeDoneByLibrary_6(result); return true; } // 定义事件,用于通知调用者 public event Action<TaskCompletionSource<string>> OnNeedCallerTask;
调用者使用示例:
var library = new YourLibraryClass(); library.OnNeedCallerTask += tcs => { // 模拟异步任务,比如弹出对话框让用户输入 Task.Run(async () => { await Task.Delay(1000); // 模拟耗时操作 tcs.SetResult("异步任务返回的结果"); }); }; await library.DoSomethingAsync();
4. 拆分方法(分步执行)
把原方法拆分为前后两部分,让调用者按顺序调用,中间插入自己的任务。
类库代码:
public void DoSomethingPart1() { SomeWorkToBeDoneByLibrary_1(); SomeWorkToBeDoneByLibrary_2(); SomeWorkToBeDoneByLibrary_3(); } public bool DoSomethingPart2(string callerResult) { SomeWorkToBeDoneByLibrary_4(callerResult); SomeWorkToBeDoneByLibrary_5(callerResult); SomeWorkToBeDoneByLibrary_6(callerResult); return true; }
调用者使用示例:
var library = new YourLibraryClass(); // 第一步:执行类库前半段任务 library.DoSomethingPart1(); // 调用者执行自己的任务 string myResult = "调用者处理后的结果"; // 第二步:执行类库后半段任务 library.DoSomethingPart2(myResult);
搜索关键词推荐
你可以搜索这些关键词深入了解相关实现:
- C# 委托 回调
- C# 接口 契约
- C# TaskCompletionSource 异步等待
- C# 类库 交互模式
内容的提问来源于stack exchange,提问作者the newbie coder
相关产品推荐
相关产品推荐

