【发布时间】:2015-12-09 01:46:39
【问题描述】:
自从我使用任务和 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
标签: c# async-await task-parallel-library .net-4.5.2