C# 在winrt应用程序中使用sqlite net时释放锁后未返回异步值

C# 在winrt应用程序中使用sqlite net时释放锁后未返回异步值,c#,locking,async-await,sqlite-net,C#,Locking,Async Await,Sqlite Net,我最近遇到了这个非常奇怪的问题。 最初我有这段代码 public async Task<string> Fetch(string module, string input) { if (module != this._moduleName) { return null; } try { var db = new SQLiteAsyncConnection(_dbPath); ResponsePag

我最近遇到了这个非常奇怪的问题。 最初我有这段代码

public async Task<string> Fetch(string module, string input)
{
    if (module != this._moduleName)
    {
        return null;
    }
    try
    {
        var db = new SQLiteAsyncConnection(_dbPath);
        ResponsePage storedResponse = new ResponsePage();

        Action<SQLiteConnection> trans = connect =>
            {
                storedResponse = connect.Get<ResponsePage>(input);
            };
        await db.RunInTransactionAsync(trans);
        string storedResponseString = storedResponse.Response;
        return storedResponseString;
    }
    catch (Exception e)
    {
        return null;
    }
}
公共异步任务获取(字符串模块,字符串输入)
{
如果(模块!=此.\u模块名称)
{
返回null;
}
尝试
{
var db=新的SQLiteAsyncConnection(_dbPath);
ResponsePage storedResponse=新ResponsePage();
动作trans=connect=>
{
storedResponse=connect.Get(输入);
};
等待db.RunInTransactionAsync(trans);
string storedResponseString=storedResponse.Response;
返回存储响应字符串;
}
捕获(例外e)
{
返回null;
}
}
但是,在事务完成运行后,控制权将永远不会返回给我的代码。我跟踪了程序,似乎在锁被释放后,程序流停止了。然后,我从SQLiteAsyncConnection类切换到使用GetAsync方法。基本上它做了同样的事情,所以我仍然在等待中受阻。然后,我删除了异步调用,并使用了如下所示的同步api:

public async Task<string> Fetch(string module, string input)
{
    if (module != this._moduleName)
    {
        return null;
    }
    try
    {
        var db = new SQLiteConnection(_dbPath);
        ResponsePage storedResponse = new ResponsePage();
        lock (_dbLock)
        {
            storedResponse = db.Get<ResponsePage>(input);
        }
        string storedResponseString = storedResponse.Response;
        return storedResponseString;
    }
    catch (Exception e)
    {
        return null;
    }
}
公共异步任务获取(字符串模块,字符串输入)
{
如果(模块!=此.\u模块名称)
{
返回null;
}
尝试
{
var db=新的SQLiteConnection(_dbPath);
ResponsePage storedResponse=新ResponsePage();
锁(_dbLock)
{
storedResponse=db.Get(输入);
}
string storedResponseString=storedResponse.Response;
返回存储响应字符串;
}
捕获(例外e)
{
返回null;
}
}
只有这样,逻辑才能流回我的代码。但是我不明白为什么会这样。
另一个问题是,对于这种简单的查询,如果我使用aysnc api而不是sync api,在查询时间方面有什么好处吗?如果没有,我将继续使用同步版本。

您很可能正在调用
Result
(或
Wait
)从
Fetch
向上调用堆栈。正如我解释和解释的那样,这将导致僵局


对于第二个问题,
async
有一些开销,因此对于极快的异步操作,同步版本会更快。除非进行分析,否则无法判断代码中是否存在这种情况。

谢谢!我发现这正是造成我问题的原因,而你的问题帮助我解决了问题。我还更好地理解了异步方法的使用。