c# - 这是启动匿名任务并继续 ui 线程的好方法吗?

标签 c# async-await task-parallel-library .net-4.5.2

我已经有一段时间没有使用任务和 lambda 表达式了。这是使用 lambda 表达式运行匿名任务,然后在任务完成时在 UI 线程上运行代码的好方法吗?

private void btn_mods_Click(object sender, RoutedEventArgs e)
{
    function_buttons_stackpanel.IsEnabled = false;
    Loading();
    Task task = new Task(() => {
        if (IsServiceIsUp() != false)
        {
            webServiceMods = JsonConvert.DeserializeObject(_webServiceResponse).mods;
            webServiceBaseUrl = JsonConvert.DeserializeObject(_webServiceResponse).basePath;
            Console.Write(webServiceBaseUrl);

        }
    });
    task.Start();
    task.ContinueWith((foo) =>
    {
        FinishedLoading();
        function_buttons_stackpanel.IsEnabled = true;
    }, TaskScheduler.FromCurrentSynchronizationContext());

}

private void Loading()
{
    img_loading.Visibility = Visibility.Visible;
}

private void FinishedLoading()
{
    img_loading.Visibility = Visibility.Collapsed;
}

我尝试直接链接任务。启动,但这给了我一个错误无法将类型 void 隐式转换为 System.Threading.Tasks.Task

基本上我想做的是将整个过程从开始到结束链接起来。

Task task = new Task(() => {
    if (IsServiceIsUp() != false)
    {
        webServiceMods = JsonConvert.DeserializeObject(_webServiceResponse).mods;
        webServiceBaseUrl = JsonConvert.DeserializeObject(_webServiceResponse).basePath;
        Console.Write(webServiceBaseUrl);

    }
}).Start();

在 PHP 中我会做这样的事情:

$task = new Task(() => {
    if (IsServiceIsUp() != false)
    {
        $webServiceMods = JsonConvert::DeserializeObject($_webServiceResponse).mods;
        $webServiceBaseUrl = JsonConvert::DeserializeObject($_webServiceResponse).basePath;
        Console::Write($webServiceBaseUrl);

    }
})
->Start()
->ContinueWith(($foo) =>
{
    FinishedLoading();
    $function_buttons_stackpanel.IsEnabled = true;
}, TaskScheduler::FromCurrentSynchronizationContext());

这可能吗?如果是这样,有什么理由不这样做,如果有更好的方法可以做到这一点,你能给我一个例子吗?

谢谢!

最佳答案

您可以使用 async-await 相当轻松且更简洁地完成此操作:

private async void btn_mods_Click(object sender, RoutedEventArgs e)
{
    if (!IsServiceIsUp())
        return;

    function_buttons_stackpanel.IsEnabled = false;
    Loading();
    await Task.Run(() => 
    {
        var result = JsonConvert.DeserializeObject(_webServiceResponse);
        Console.Write(result.webServiceBaseUrl);
    });

    FinishedLoading();
    function_buttons_stackpanel.IsEnabled = true;
}

就性能而言,我不太确定您是否需要使用线程池线程来反序列化 JSON。我肯定会测试这段代码以确定它是否值得。

关于c# - 这是启动匿名任务并继续 ui 线程的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32541410/

相关文章:

c# - http 错误 400。请求动词无效。 iis express 8

c# - 从异步方法关闭 WCF 服务?

.net - 多核环境中的多线程应用程序 - 每个核心的奇怪负载

c# - 是否需要定义 Int 变量才能从不同线程访问?

c# - 在 C# 并行任务中为多个服务调用创建并行任务

c# - MVC Razor 字符问题

c# - 如何创建类似于 ForEach 的方法

c# - 在 DataGridview C# 中打印 Csv 数据而不使用 olehDBconnect

c# - 异步/等待。方法的可等待部分的延续在哪里执行?

c# - 返回内存中(缓存的)集合,或来自异步等待响应的任务