等待ACtion带参数事件执行完成C#
时间: 2024-10-19 20:10:58 浏览: 13
C# 多线程 参数传递 示例
3星 · 编辑精心推荐
在C#中,如果你需要等待某个Action(操作)带参数的方法执行完毕,可以使用`Task`、`async`/`await`或者`System.Threading.Tasks.TaskCompletionSource`来实现异步编程。以下是一个简单的例子:
```csharp
using System;
using System.Threading.Tasks;
public class AsyncExample
{
public async Task ExecuteWithParams(Func<int, int, Task> action, int param1, int param2)
{
// 创建一个任务完成源,用于跟踪操作的结果
var tcs = new TaskCompletionSource<int>();
// 异步执行Action,并将结果通过TaskCompletionSource传递
await action(param1, param2).ContinueWith(task =>
{
if (task.IsFaulted)
{
tcs.SetException(task.Exception);
}
else if (task.IsCanceled)
{
tcs.SetCanceled();
}
else
{
tcs.SetResult(task.Result); // 如果操作成功,设置结果
}
});
// 使用await获取异步操作的结果
try
{
int result = await tcs.Task; // 这里会阻塞直到action完成并返回结果
Console.WriteLine($"Action completed with result: {result}");
}
catch (OperationCanceledException)
{
Console.WriteLine("Action was canceled");
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
public static void Main(string[] args)
{
AsyncExample example = new AsyncExample();
// 调用示例方法,传入你需要执行的操作和参数
example.ExecuteWithParams((a, b) => SomeLongRunningOperation(a, b), 10, 20); // 注意这里SomeLongRunningOperation是你实际定义的耗时操作
}
}
// 你可以定义一个模拟的长时间运行操作
private static async Task<int> SomeLongRunningOperation(int a, int b)
{
await Task.Delay(1000); // 模拟耗时操作
return a + b;
}
```
在这个例子中,`ExecuteWithParams`方法接受一个`Func<int, int, Task>`类型的参数,这个参数代表一个接收两个整数参数并返回`Task`的任务。通过`await`关键字,我们可以等待这个操作完成,并处理其结果。
阅读全文