你好我有以下问题:
我想执行类似于事务的操作。我想async
在收到外部触发器后执行一些操作。因此,我使用的TaskCompletionSource
是在表示触发器的方法中设置的 : TriggerTransaction
。 当我按下特定的控制台键时,
会在线程池中调用此触发方法。Main
在我按下A
关键字后,TriggerTransaction
执行并设置TaskCompletionSource
-s。仍然主线程不计算两个等待任务的总和。
class Program
{
public static Task<Task<int>> TransactionOperation1()
{
TaskCompletionSource<Task<int>> tcs = new TaskCompletionSource<Task<int>>();
tasks.Add(tcs);
Task<Task<int>> result = tcs.Task;
return result;
}
public static Task<Task<int>> TransactionOperation2()
{
TaskCompletionSource<Task<int>> tcs = new TaskCompletionSource<Task<int>>();
tasks.Add(tcs);
Task<Task<int>> result = tcs.Task;
return result;
}
public static async Task<int> ExecuteTransactionOnDB()
{
await Task.Delay(1000);
return 5;
}
public static async Task TriggerTransaction()
{
int value = await ExecuteTransactionOnDB();
foreach (var item in tasks)
{
item.SetResult(value);
}
}
public static List<dynamic> tasks = new List<dynamic>();
static async Task Main(string[] args)
{
Task<Task<int>> a = TransactionOperation1();
Task<Task<int>> b = TransactionOperation2();
Task.Run(async() =>
{
while (Console.ReadKey().Key != ConsoleKey.A) ;
await TriggerTransaction();
});
if (!File.Exists("D:\\data.txt"))
{
File.Create("D:\\data.txt");
}
using(FileStream stream=new FileStream("data.txt",FileMode.Append,FileAccess.Write))
{
int sum=await await a + await await b;//thread wont pass this line when tasks are set.
ReadOnlyMemory<byte> bytes = Encoding.UTF8.GetBytes(sum);
stream.Write(bytes.ToArray());
}
Console.WriteLine(await await a + await await b);
}
}
}
PS如果你想知道为什么我确实使用 aList<dynamic>
来存储TaskCompletionSource
-s ,那是因为 TransactionOperations 的返回类型会有所不同。其中一些会返回int
,其他String
.. ..etc Bool
。
为了更好地理解,我制作了一个架构-正如您将看到的那样:
-我要存储 TCS-es 的列表-
仅在设置外部触发器后才完成的某些调用(事务已执行)
您可以在 中看到Calls
,都有不同的返回类型。