相关疑难解决方法(0)

使用任务(TPL)库是否使应用程序成为多线程?

最近在接受采访时,我得到了这个问题.

问:您是否编写过多线程应用程序?

答:是的

问:关心解释更多?

答:我用Tasks(任务并行库)来执行一些任务waiting for some info from internet while loading UI.这提高了我的应用程序可用性.

问:但是,您是否已经使用过TPL手段来编写multithreaded应用程序?

我:(不知道该说些什么1)

那么,什么是多线程应用程序呢?它与使用不同Tasks吗?

c# multithreading .net-4.0 multitasking task-parallel-library

26
推荐指数
1
解决办法
2万
查看次数

Oracle托管驱动程序可以正确使用异步/等待吗?

我试图使用async/wait .NET功能进行Oracle查询.结果集非常大,需要大约5-10秒才能恢复.Window_Loaded挂起了UI线程,本质上我想使用async/wait在后台进行查询,然后使用结果更新数据视图.

这是Oracle驱动程序问题还是代码错误?例如,这是同步而不是异步完成的事情吗?我正在使用Oracle.ManagedDataAccessOracle可以从Oracle网站获得的最新信息.

async Task<DataTable> AccessOracleAsync()
{
    DataTable dt;
    using(OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString))
    using (OracleCommand cmd = new OracleCommand(@"SELECT * FROM myTbl", conn))
    {
        await conn.OpenAsync();
        using (var reader = await cmd.ExecuteReaderAsync())
        {
            dt = new DataTable();
            dt.Load(reader);                        
        }
    }

    return dt;
}

private async void Window_Loaded(object sender, RoutedEventArgs e)
{
    await AccessOracleAsync();
}
Run Code Online (Sandbox Code Playgroud)

我试过这个,它仍然在用户界面陷入僵局:

async Task<DataView> AccessOracleAsync()
{
        DataTable dt;
        using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString))
        using (OracleCommand cmd = new OracleCommand(@"SELECT * FROM myTbl", conn)) …
Run Code Online (Sandbox Code Playgroud)

.net c# oracle async-await odp.net-managed

22
推荐指数
3
解决办法
6272
查看次数

如何衡量等待异步操作的性能?

我有一个从多个MessageQueue实例读取的Windows服务.这些消息队列都有自己Task的阅读消息.通常,在阅读消息后,I/O数据库的工作就完成了.我发现文章声称在I/O操作上使用异步是个好主意,因为它可以释放线程.我正在尝试模拟在控制台应用程序中使用异步I/O操作的性能提升.

控制台应用程序

在我的测试环境中,我有10个队列.GetQueues()返回10个不同的MessageQueue实例.

static void Main(string[] args)
{
    var isAsync = Console.ReadLine() == "Y";
    foreach (var queue in queueManager.GetQueues())
    {
        var temp = queue;
        Task.Run(() => ReceiveMessagesForQueue(temp, isAsync));
    }

    while (true)
    {
        FillAllQueuesWithMessages();
        ResetAndStartStopWatch();
        while(!AllMessagesRead())
        {
            Thread.Sleep(10);
        }
        Console.WriteLine("All messages read in {0}ms", stopWatch.ElapsedMilliseconds);
    }
}

static async Task ReceiveMessagesForQueue(MessageQueue queue, bool isAsync)
{
    while (true)
    {
        var message = await Task.Factory.FromAsync<Message>(queue.BeginReceive(), queue.EndReceive);

        if (isAsync)
            await ProcessMessageAsync(message);
        else
            ProcessMessage(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

异步消息处理 …

c# performance-testing task-parallel-library async-await c#-5.0

7
推荐指数
1
解决办法
2941
查看次数

使用ADO.NET异步调用Oracle DB

我正在尝试使用异步和等待.NET Framework 4.5中提供的功能执行多个数据库调用.这是我第一次实现此功能.

如果每个查询花费7秒,则过去需要35秒(5个查询*7秒).通过以下实现,我期待它应该在接近7-9秒的时间内在asp页面中获取和填充控件.但是,它仍然需要35秒,证明了我的同步行为.

有人可以帮助我在下面的异步实现中出错.

我对任何投入表示赞赏,因为几天以来我一直在为此而烦恼

    protected void Page_Load(object sender, System.EventArgs e)
    {
        RegisterAsyncTask(new PageAsyncTask(FillControlsAsync));
    }

    public async Task FillControlsAsync()
    {
         Task[] tasks = new Task[]{
         PopulateControlTask(query1, "controlID1"),
         PopulateControlTask(query2, "controlID2"),
         PopulateControlTask(query3, "controlID3"),
         PopulateControlTask(query4, "controlID4"),
         PopulateControlTask(query5, "controlID5")
        });

        await Task.WhenAll(tasks);
    }
    public async Task PopulateControlTask(string query, string control)
    {
       await Task.Run(() =>
           {
               DataSet ds;
               OracleCommand cmd;
               OracleDataAdapter da;
               try
               {
                   if (!Page.IsPostBack)
                   {
                       cmd = new OracleCommand(query, cn);
                       da = new OracleDataAdapter(cmd);
                       ds = new DataSet();
                       da.Fill(ds);
                       switch (control)
                       { …
Run Code Online (Sandbox Code Playgroud)

c# asp.net ado.net webforms async-await

0
推荐指数
1
解决办法
1409
查看次数