gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:55:08 26 4
gpt4 key购买 nike

自从我处理任务和 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;
}

我尝试链接任务。直接启动,但这给了我一个错误 Cannot Implicitly convert type void to 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com