写异步方法的疑问

ms__csharp 2018-02-08 05:19:00
经常使用的异步WebClient 类,但如果要自己写异步类,要怎么写?类似下面的代码段,有什么问题呢?

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];
}
}
}

还有这个:http://bbs.csdn.net/topics/392320228
...全文
1572 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2018-02-11
  • 打赏
  • 举报
回复
我只知道 cancellationtokensourc类,没见过 CancellationTokenRegistration
ms__csharp 2018-02-09
  • 打赏
  • 举报
回复
.net core 的SqlCommand.cs 中有ExecuteReaderAsync

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;
        }
看不太明白
  • 打赏
  • 举报
回复
微软提供的就是默认帮你写好了这部分,跟你自己写没太大区别
  • 打赏
  • 举报
回复
async/await 方式写起来代码少、省得敲坏键盘、打印时省墨水。当然其缺点就是要求脑子里有异步机制概念而不会跟同步操作相混淆(随时都要在脑子里模拟一遍异步)。
秋的红果实 2018-02-08
  • 打赏
  • 举报
回复
引用 5 楼 ms__csharp 的回复:
[quote=引用 3 楼 From_TaiWan 的回复:] 没看到webclient,同步调用GetData,正常 调用GetDataAsync也是可以的
因为看到的都是使用ms提供的异步方法。但是GetDataAsync的方法也是可以执行的,但很少看到。如果在其他的地方要实现自己的异步方法,类似上面的方法有哪些缺点核问题?[/quote]那个帖子我已经说了,类似写法还可以用委托的异步实现,搜索IAsyncResult接口,不过我觉得async/await方式还是比较好的,尽管用的人少 我知道的,只有这两种方式,可以解决你类似的问题
ms__csharp 2018-02-08
  • 打赏
  • 举报
回复
引用 3 楼 From_TaiWan 的回复:
没看到webclient,同步调用GetData,正常 调用GetDataAsync也是可以的
因为看到的都是使用ms提供的异步方法。但是GetDataAsync的方法也是可以执行的,但很少看到。如果在其他的地方要实现自己的异步方法,类似上面的方法有哪些缺点核问题?
秋的红果实 2018-02-08
  • 打赏
  • 举报
回复
没看到webclient,同步调用GetData,正常 调用GetDataAsync也是可以的
秋的红果实 2018-02-08
  • 打赏
  • 举报
回复
那个帖子里面,用我写的方法,应该可以工作,不知道你想要达到什么要求?
ms__csharp 2018-02-08
  • 打赏
  • 举报
回复
先不用管类似ExecuteReaderAsync的ms提供的方法。
ms__csharp 2018-02-08
  • 打赏
  • 举报
回复
BeginExecuteReader的方式也先不讨论

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧