C# 如何返回任务<;对象>;在子任务上使用continuation
我喜欢最小化互相等待但不显示为一个的任务调度 如何更改TestOption1以将任务返回调用方法C# 如何返回任务<;对象>;在子任务上使用continuation,c#,task-parallel-library,C#,Task Parallel Library,我喜欢最小化互相等待但不显示为一个的任务调度 如何更改TestOption1以将任务返回调用方法 [TestClass()] 公共类SqlServerTests { public const string Membership=“数据源=本地主机;初始目录=tempdb;集成安全性=True;”; [TestMethod()] 公共异步任务ContinueWithTest() { 使用CancellationTokenSource cts=new CancellationTokenSource
[TestClass()]
公共类SqlServerTests
{
public const string Membership=“数据源=本地主机;初始目录=tempdb;集成安全性=True;”;
[TestMethod()]
公共异步任务ContinueWithTest()
{
使用CancellationTokenSource cts=new CancellationTokenSource();
//预热,以便在所有3种方法上启用池
使用(var con=newsqlconnection(成员资格))
使用(var cmd=con.CreateCommand())
{
cmd.CommandType=System.Data.CommandType.Text;
cmd.CommandText=“将nocount设置为on”;
con.Open();
cmd.ExecuteNonQuery();
}
var sw2=System.Diagnostics.Stopwatch.StartNew();
等待测试选项2(cts.Token)。配置等待(false);
sw2.Stop();
//让迟钝者受益于怀疑,并给它兑现计划
var sw3=System.Diagnostics.Stopwatch.StartNew();
等待测试选项3(cts.Token)。配置等待(false);
sw3.Stop();
Assert.IsTrue(sw2.ElapsedTickscmd.ExecuteNonQuery()
,取消代币
,continuationOptions:TaskContinuationOptions.ExecuteSynchronously
,调度程序:TaskScheduler.Default);
}
}
专用静态异步任务TestOption2(CancellationToken CancellationToken=default)
{
使用(var con=newsqlconnection(成员资格))
使用(var cmd=con.CreateCommand())
{
cmd.CommandType=System.Data.CommandType.Text;
cmd.CommandText=“将nocount设置为on”;
等待con.OpenAsync(cancellationToken)
.ContinueWith((\u)=>cmd.ExecuteOnQuery(),cancellationToken).ConfigureWait(false);
}
}
专用静态异步任务TestOption3(CancellationToken CancellationToken=default)
{
使用(var con=newsqlconnection(成员资格))
使用(var cmd=con.CreateCommand())
{
cmd.CommandType=System.Data.CommandType.Text;
cmd.CommandText=“将nocount设置为on”;
wait con.OpenAsync(cancellationToken).configurewait(false);
wait cmd.ExecuteNonQueryAsync().ConfigureWait(false);
}
}
}
我希望能够做这样的事情
[TestMethod]
public async Task TestContinueWithDelegate()
{
var data = await TestOptionReturn().ConfigureAwait(false);
Assert.IsNotNull(data);
}
private static Task<object> TestOptionReturn(CancellationToken cancellationToken = default)
{
using (var con = new SqlConnection(Membership))
using (var cmd = con.CreateCommand())
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "Test1";
return con.OpenAsync(cancellationToken)//fails as it does not wait for the db to open....
.ContinueWith(delegate { return cmd.ExecuteScalar(); }
, cancellationToken
, continuationOptions: TaskContinuationOptions.ExecuteSynchronously
, scheduler: TaskScheduler.Default);
}
}
[TestMethod]
公共异步任务TestContinueWithDelegate()
{
var data=await TestOptionReturn().ConfigureAwait(false);
Assert.IsNotNull(数据);
}
私有静态任务TestOptionReturn(CancellationToken CancellationToken=默认值)
{
使用(var con=newsqlconnection(成员资格))
使用(var cmd=con.CreateCommand())
{
cmd.CommandType=System.Data.CommandType.StoredProcess;
cmd.CommandText=“Test1”;
return con.OpenAsync(cancellationToken)//失败,因为它没有等待数据库打开。。。。
.ContinueWith(委托{return cmd.ExecuteScalar();}
,取消代币
,continuationOptions:TaskContinuationOptions.ExecuteSynchronously
,调度程序:TaskScheduler.Default);
}
}
由于数据库未打开,以下测试失败
[测试方法]
公共异步任务TestContinueWithDelegate()
{
使用CancellationTokenSource cts=new CancellationTokenSource();
var data=await TestOptioDDL(cts.Token).ConfigureAwait(false);
使用var reader=await TestOptionOutput(cts.Token).ConfigureAwait(false);
Assert.IsNotNull(数据);
Assert.IsTrue(reader.Read());
}
private static Task<object> TestOptioDDL(CancellationToken cancellationToken = default)
{
using (var con = new SqlConnection(Membership))
using (var cmd = con.CreateCommand())
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "TestOutput";
cmd.Parameters.Add(new SqlParameter("Data", System.Data.SqlDbType.DateTime) { IsNullable = true, Direction = System.Data.ParameterDirection.Output });
return con.OpenAsync(cancellationToken)//fails as it does not wait for the db to open....
.ContinueWith(delegate
{
cmd.ExecuteScalar();
return cmd.Parameters[0].Value;
}
, cancellationToken
, continuationOptions: TaskContinuationOptions.ExecuteSynchronously
, scheduler: TaskScheduler.Default);
}
}
private static Task<SqlDataReader> TestOptionOutput(CancellationToken cancellationToken = default)
{
using (var con = new SqlConnection(Membership))
using (var cmd = con.CreateCommand())
{
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = "select * from sys.databases";
cmd.Parameters.Add(new SqlParameter("Data", System.Data.SqlDbType.DateTime) { IsNullable = true, Direction = System.Data.ParameterDirection.Output });
return con.OpenAsync(cancellationToken)//fails as it does not wait for the db to open....
.ContinueWith(delegate
{
return cmd.ExecuteReader();
}
, cancellationToken
, continuationOptions: TaskContinuationOptions.ExecuteSynchronously
, scheduler: TaskScheduler.Default);
}
}
private static Task TestOptioDDL(CancellationToken CancellationToken=default)
{
使用(var con=newsqlconnection(成员资格))
使用(var cmd=con.CreateCommand())
{
cmd.CommandType=System.Data.CommandType.StoredProcess;
cmd.CommandText=“TestOutput”;
Add(新的SqlParameter(“Data”,System.Data.SqlDbType.DateTime){IsNullable=true,Direction=System.Data.ParameterDirection.Output});
return con.OpenAsync(cancellationToken)//失败
private static Task<object> TestOptioDDL(CancellationToken cancellationToken = default)
{
using (var con = new SqlConnection(Membership))
using (var cmd = con.CreateCommand())
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "TestOutput";
cmd.Parameters.Add(new SqlParameter("Data", System.Data.SqlDbType.DateTime) { IsNullable = true, Direction = System.Data.ParameterDirection.Output });
return con.OpenAsync(cancellationToken)//fails as it does not wait for the db to open....
.ContinueWith(delegate
{
cmd.ExecuteScalar();
return cmd.Parameters[0].Value;
}
, cancellationToken
, continuationOptions: TaskContinuationOptions.ExecuteSynchronously
, scheduler: TaskScheduler.Default);
}
}
private static Task<SqlDataReader> TestOptionOutput(CancellationToken cancellationToken = default)
{
using (var con = new SqlConnection(Membership))
using (var cmd = con.CreateCommand())
{
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = "select * from sys.databases";
cmd.Parameters.Add(new SqlParameter("Data", System.Data.SqlDbType.DateTime) { IsNullable = true, Direction = System.Data.ParameterDirection.Output });
return con.OpenAsync(cancellationToken)//fails as it does not wait for the db to open....
.ContinueWith(delegate
{
return cmd.ExecuteReader();
}
, cancellationToken
, continuationOptions: TaskContinuationOptions.ExecuteSynchronously
, scheduler: TaskScheduler.Default);
}
}