2016-04-12 18 views
0

SQLiteを使用して自分のアプリケーションにアカウントテーブルを作成しようとしていますが、エラーをスローせずにCreateTableAsync呼び出し中にアプリケーションがハングします。SQLiteがCreateTablesAsync - Xamarinフォームでハングアップする

LocalDataContext.Instance.CreateTablesAsync(typeof(Account)).Wait(); 

var account = LocalDataContext.Instance.GetFirstOrDefaultAsync<Account>().Result; 

したがって、アプリケーションは最初の呼び出しに入り、2番目の行には到達しません。ここで

CreateTablesAsyncメソッドのコードです:

/// <summary> 
    /// Creates the local database tables. 
    /// </summary> 
    public async Task CreateTablesAsync(params Type[] tableTypes) 
    { 
     await _connection.CreateTablesAsync(tableTypes); 
    } 

これはハングアウトプットの最後の行がFound as 'sqlite3_column_int'.

であり、ここでAccountモデルです:

public class Account 
    { 
    /// <summary> 
    /// Primary key for record. 
    /// </summary> 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 

    /// <summary> 
    /// Gets or sets the Client ID. 
    /// </summary> 
    public string ClientId { get; set; } 

    /// <summary> 
    /// Gets or sets the User ID. 
    /// </summary> 
    public string UserId { get; set; } 

    /// <summary> 
    /// Gets or sets the user password. 
    /// </summary> 
    public int Password { get; set; } 
} 

誰もなぜこれが起こっているのか知っていますか?

+0

タスクを実行し、 'await LocalDataContext.Instance.GetFirstOrDefaultAsync ()'を代わりに使用する代わりに、 'Result'を使ってデッドロックする可能性があります。 'Task.Run'を使ってテーブルを作成し、上記のように単純に検索して取得することができます。 http://stackoverflow.com/questions/13140523/await-vs-task-wait-deadlock –

答えて

0

SQLite.Net Asyncを使用していますが、それを同期的に呼び出そうとする特定の理由はありますか?同期待機中ではなくawait LocalDataContext.Instance.CreateTablesAsync(typeof(Account))に電話する必要があります。おそらくどこかでデッドロックに当たっているでしょう。

がある場合は、SQLite.Net(非同期バージョンではない)を使用するか、別の場所からcreate tableメソッドを呼び出す必要があります。

はまた、これは本当にそれで唯一のコードであれば、あなたがCreateTablesAsyncを変更することができます。

個人的に
public Task CreateTablesAsync(params Type[] tableTypes) 
{ 
    return _connection.CreateTablesAsync(tableTypes); 
} 

、私は非非同期可能なコードで非同期メソッドを呼び出すために必要で同様の問題がありました。私はちょうど同期版と一緒に行き、問題はなかった。

関連する問題