Одно из более тонких различий между ними заключается в том, что ключевое слово «as» нельзя использовать для приведения, когда задействован оператор приведения:
public class Foo
{
public string Value;
public static explicit operator string(Foo f)
{
return f.Value;
}
}
public class Example
{
public void Convert()
{
var f = new Foo();
f.Value = "abc";
string cast = (string)f;
string tryCast = f as string;
}
}
Это не скомпилируется (хотя я думаю, что в предыдущих версиях) в последней строке, так как ключевые слова "as" не учитывают операторы приведения. Линия string cast = (string)f;
работает просто отлично.
Задача использует поток для выполнения асинхронный. Задача может рассматриваться как удобный и простой способ выполнить что-то асинхронно и параллельно.
Обычно Задача - все, в чем Вы нуждаетесь, я не могу помнить, использовал ли я когда-либо поток для чего-то еще, чем экспериментирование.
можно выполнить то же с потоком, как Вы можете с задачей.
Поток
int result = 0;
Thread thread = new System.Threading.Thread(() => {
result = 1;
});
thread.Start();
thread.Join();
Console.WriteLine(result); //is 1
Задача
int result = await Task.Run(() => {
return 1;
});
Console.WriteLine(result); //is 1
задача будет значением по умолчанию использовать Пул потоков, который сохраняет ресурсы, поскольку создающие потоки могут быть дорогими. Вы видите Задачу как высокоуровневую абстракцию на потоки.