C# 如何返回任务<;对象>;在子任务上使用continuation

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

我喜欢最小化互相等待但不显示为一个的任务调度 如何更改TestOption1以将任务返回调用方法

[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);
            }
        }