4

データベースの読み取りが遅いために実行中のスレッドがブロックされるのを避けたい、BLToolkit DataAccessor がとても気に入っている

public abstract class PersonAccessor : DataAccessor
{
    [SqlText(@"SELECT * FROM Person WHERE FirstName = @firstName")]
    public abstract List<Person> GetPersonListByFirstName(string @firstName);

    [SprocName("sp_GetPersonListByLastName")]
    public abstract List<Person> GetPersonListByLastName(string @lastName);
}

BLToolkit DataAccessor に非同期操作を使用することは可能ですか?

それが戻ってきて、C# 5.0からTask<T>使用できることを願っていますawait

Br.

4

1 に答える 1

2

Begin End パターンを提供するAsync属性を組み合わせて、次のように Task に変換することができます (テストされていません)。

public abstract class PersonAccessor : DataAccessor
{
    [SqlText(@"SELECT * FROM Person WHERE FirstName = @firstName")]
    public abstract List<Person> GetPersonListByFirstName(string @firstName);

    [Async]
    public abstract IAsyncResult BeginGetPersonListByFirstName(string @firstName, AsyncCallback callback, object state);

    [Async]
    public abstract List<Person> EndGetPersonListByFirstName(IAsyncResult asyncResult);

    public Task<List<Person>> GetPersonListByFirstNameAsync(string @firstName)
    {
        return Task.Factory.FromAsync(
            BeginGetPersonListByFirstName(),
            EndGetPersonListByFirstName,
            @firstName, 
            null);
    }
}

public class TestClass 
{
    public List<Person> AwaitTest(PersonAccessor personAccessor, string @firstName)
    {
        return await personAccessor.GetPersonListByFirstNameAsync(@firstName);
    }
}
于 2014-11-03T13:07:27.103 に答える