相关疑难解决方法(0)

使用Task.Run调用异步方法似乎错了?

我最近遇到了这个由我们为我们工作的承包商编写的代码.它要么是非常聪明或愚蠢(我认为后者,但我想要第二个意见).我没有大规模的速度async await.

基本上它的工作方式如下:

public bool Send(TemplatedMessageDto message)
{
    return Task.Run(() => SendAsync(message))
        .GetAwaiter()
        .GetResult();
}

public async Task<bool> SendAsync(TemplatedMessageDto message)
{
    //code doing stuff
    var results = await _externalresource.DothingsExternally();
    //code doing stuff
}
Run Code Online (Sandbox Code Playgroud)

据我所知,首先Task.Run()是无意义和低效的?应该是:

public bool Send(TemplatedMessageDto message)
{
    return SendAsync(message))
    .GetAwaiter()
    .GetResult();
}

public async Task<bool> SendAsync(TemplatedMessageDto message)
{
    //code doing stuff
    var results = await _externalresource.DothingsExternally();
    //code doing stuff
}
Run Code Online (Sandbox Code Playgroud)

我也不相信这实际上是一种异步方法,因为它仍然会等待,对吧?我认为唯一的优势(甚至是重写)就是释放主要的工作者线程.

有人可以确认第一个任务不应该存在吗?

c# multithreading asynchronous task-parallel-library async-await

11
推荐指数
2
解决办法
1757
查看次数

WPF Dispatcher Thread Freeze主窗口

而不是在后台工作 - 这段代码仍然冻结我的程序:

private void button_Click(object sender, RoutedEventArgs e)
{
    this.Dispatcher.BeginInvoke(new Action(() =>
    {
        Thread.Sleep(5000);
        label.Content = "Done";
    }), DispatcherPriority.Normal);
}
Run Code Online (Sandbox Code Playgroud)

我试过Thread/Tasks,线程示例:

private void button_Click(object sender, RoutedEventArgs e)
{
    var t = new Thread(new ThreadStart(runtask));
    t.Start();
}

private void runtask()
{
    this.Dispatcher.BeginInvoke(new Action(() =>
    {
        Thread.Sleep(5000);
        label.Content = "Done";
    }), DispatcherPriority.Normal);
}
Run Code Online (Sandbox Code Playgroud)

任务示例:

private void button_Click(object sender, RoutedEventArgs e)
{
    Task.Run(() =>
    {
        Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
        {
            Thread.Sleep(5000);
            label.Content = "Done";
        }));
    });
}
Run Code Online (Sandbox Code Playgroud)

我的节目仍然冻结.有什么建议?

c# wpf multithreading task dispatcher

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