You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:39:37