gpt4 book ai didi

c# - 如何同步调用异步(await)方法?

转载 作者:行者123 更新时间:2023-12-03 09:25:52 25 4
gpt4 key购买 nike

我正在使用 parse.com 提供的 .NET API,

https://parse.com/docs/dotnet_guide#objects-saving

我的代码片段如下所示;

public async void UploadCurrentXML()
{
...
var query = ParseObject.GetQuery("RANDOM_TABLE").WhereEqualTo("some_field", "string");
var count = await query.CountAsync();
ParseObject temp_A;
temp_A = await query.FirstAsync();
...
// do lots of stuff
...
await temp_A.SaveAsync();
}

总结一下;对远程数据库进行查询。根据结果​​,从数据库中获取特定对象(或其引用)。对对象执行多次操作,最后将其保存回数据库。

所有数据库操作都是通过 await ParseObject.randomfunction() 发生的。是否可以以同步方式调用这些函数?或者至少等到手术恢复而不​​继续进行?该应用程序专为维护目的而设计,操作时间不是问题。

我问这个是因为就目前情况而言,我收到一个错误,其中指出

The number of count operations in progress has reached its limit.

我已经尝试过了,

var count = await query.CountAsync().ConfigureAwait(false);

在所有等待调用中,但这没有帮助 - 代码仍在异步运行。

var count = query.CountAsync().Result;

导致应用程序卡住 - 相当肯定我遇到了死锁。

一些搜索让我想到了这个问题,

How would I run an async Task<T> method synchronously?

但我不明白它如何适用于我的情况,因为我无权访问 ParseObject 的源代码。帮助? (我使用.NET 4.5)

最佳答案

我建议您自始至终都使用异步编程。如果您遇到某种资源问题(即不允许在单个数据库上进行多个查询),那么您应该构建代码以防止这种情况发生(例如,在操作进行时禁用 UI 按钮)。或者,如果必须的话,您可以使用 SemaphoreSlim 来限制您的 async 代码:

private readonly SemaphoreSlim _mutex = new SemaphoreSlim(1);
public async Task UploadCurrentXMLAsync()
{
await _mutex.WaitAsync();
try
{
...
var query = ParseObject.GetQuery("RANDOM_TABLE").WhereEqualTo("some_field", "string");
var count = await query.CountAsync();
ParseObject temp_A;
temp_A = await query.FirstAsync();
...
// do lots of stuff
...
await temp_A.SaveAsync();
}
finally
{
_mutex.Release();
}
}

但是如果你真的,真的想要同步阻塞,你可以这样做:

public async Task UploadCurrentXMLAsync();

Task.Run(() => UploadCurrentXMLAsync()).Wait();

再说一次,我只是不能推荐最后一个“解决方案”,它更像是一种黑客行为,而不是一个正确的解决方案。

关于c# - 如何同步调用异步(await)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com