62,025
社区成员
发帖
与我相关
我的任务
分享
class Program
{
static void Main(string[] args)
{
TestAsync db = new TestAsync();
var x = db.GetData();
/*......*/
Console.ReadKey();
}
}
public class TestAsync
{
/// <summary>
/// 异步包装操作数据库?这样有啥问题?
/// </summary>
/// <returns></returns>
public async Task<DataTable> GetDataAsync()
{
return await Task.Factory.StartNew<DataTable>(() =>
{
return GetData();
}, CancellationToken.None);
}
/// <summary>
/// 操作数据库
/// </summary>
/// <returns></returns>
public DataTable GetData()
{
var sqlconnstring = "dbconnection";
using (SqlConnection conn = new SqlConnection(sqlconnstring))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select 1 as T1,2 as T2,3 as T3";
cmd.CommandType = CommandType.Text;
SqlDataAdapter readAdapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
readAdapter.Fill(ds);
return ds.Tables[0];
}
}
}
new public Task<SqlDataReader> ExecuteReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
{
Guid operationId = default(Guid);
if (!_parentOperationStarted)
operationId = _diagnosticListener.WriteCommandBefore(this);
TaskCompletionSource<SqlDataReader> source = new TaskCompletionSource<SqlDataReader>();
CancellationTokenRegistration registration = new CancellationTokenRegistration();
if (cancellationToken.CanBeCanceled)
{
if (cancellationToken.IsCancellationRequested)
{
source.SetCanceled();
return source.Task;
}
registration = cancellationToken.Register(s => ((SqlCommand)s).CancelIgnoreFailure(), this);
}
Task<SqlDataReader> returnedTask = source.Task;
try
{
RegisterForConnectionCloseNotification(ref returnedTask);
Task<SqlDataReader>.Factory.FromAsync(BeginExecuteReader, EndExecuteReader, behavior, null).ContinueWith((t) =>
{
registration.Dispose();
if (t.IsFaulted)
{
Exception e = t.Exception.InnerException;
if (!_parentOperationStarted)
_diagnosticListener.WriteCommandError(operationId, this, e);
source.SetException(e);
}
else
{
if (t.IsCanceled)
{
source.SetCanceled();
}
else
{
source.SetResult(t.Result);
}
if (!_parentOperationStarted)
_diagnosticListener.WriteCommandAfter(operationId, this);
}
}, TaskScheduler.Default);
}
catch (Exception e)
{
if (!_parentOperationStarted)
_diagnosticListener.WriteCommandError(operationId, this, e);
source.SetException(e);
}
return returnedTask;
}
看不太明白