Что такое метод замещения для Task.Run в .NET 4.0 с использованием С#?
Я получил эту программу, которая дает мне синтаксическую ошибку "System.Threading.Tasks.task не содержит определения для Run".
Я использую VB 2010.NET 4.0
Есть идеи? любые замены для Run in.net 4.0?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ChatApp
{
class ChatProg
{
static void Main(string[] args)
{
Task<int> wakeUp = DoWorkAsync(2000,"Waking up");
Task.WaitAll(wakeUp);
}
static Task<int> DoWorkAsync(int milliseconds, string name)
{
//error appears below on word Run
return Task.Run(() =>
{
Console.WriteLine("* starting {0} work", name);
Thread.Sleep(milliseconds);
Console.WriteLine("* {0} work one", name);
return 1;
});
}
}
}
Ответы
Ответ 1
Похоже, Task.Factory.StartNew<T>
- это то, что вам нужно.
return Task.Factory.StartNew<int>(() => {
// ...
return 1;
});
Поскольку компилятор может вывести возвращаемый тип, это также работает:
return Task.Factory.StartNew(() => {
// ...
return 1;
});
Ответ 2
Прочтите это: http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
В нем объясняется, что Task.Run - это в основном приятная оболочка, введенная в 4.5.
Ответ 3
Самый высокий проголосовавший ответ, к сожалению, не совсем корректен:
К сожалению, единственные перегрузки для StartNew, которые принимают TaskScheduler, также требуют, чтобы вы указали CancellationToken и TaskCreationOptions. Это означает, что для того, чтобы использовать Task.Factory.StartNew для надежной работы с прогнозируемой очередью в пуле потоков, вам необходимо использовать такую перегрузку:
Task.Factory.StartNew(A, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
Итак, самое близкое к Task.Run
в 4.0 - это что-то вроде:
/// <summary>
/// Starts the new <see cref="Task"/> from <paramref name="function"/> on the Default(usually ThreadPool) task scheduler (not on the TaskScheduler.Current).
/// It is a 4.0 method nearly analogous to 4.5 Task.Run.
/// </summary>
/// <typeparam name="T">The type of the return value.</typeparam>
/// <param name="factory">The factory to start from.</param>
/// <param name="function">The function to execute.</param>
/// <returns>The task representing the execution of the <paramref name="function"/>.</returns>
public static Task<T> StartNewOnDefaultScheduler<T>(this TaskFactory factory, Func<T> function)
{
Contract.Requires(factory != null);
Contract.Requires(function != null);
return factory
.StartNew(
function,
cancellationToken: CancellationToken.None,
creationOptions: TaskCreationOptions.None,
scheduler: TaskScheduler.Default);
}
который может использоваться как:
Task
.Factory
.StartNewOnDefaultScheduler(() =>
result);
Ответ 4
Я изменил ваш код с помощью Task.Factory.StartNew
check detail ссылка
static Task<int> DoWorkAsync(int milliseconds, string name)
{
//error appears below on word Run
return Task.Factory.StartNew(() =>
{
Console.WriteLine("* starting {0} work", name);
Thread.Sleep(milliseconds);
Console.WriteLine("* {0} work one", name);
return 1;
});
}
Ответ 5
Если вы используете Microsoft.Bcl.Async здесь, вы идете:
return TaskEx.Run(() =>
{
Console.WriteLine("* starting {0} work", name);
Thread.Sleep(milliseconds);
Console.WriteLine("* {0} work one", name);
return 1;
});
Ответ 6
Task.Factory.StartNew(() =>
{
try
{
Thread.Sleep(200);
IntPtr TouchhWnd = IntPtr.Zero;
TouchhWnd = FindWindow(null, "屏幕键盘");
if (TouchhWnd != IntPtr.Zero)
{
SetWindowPos(TouchhWnd, HWND_TOPMOST, 500, 500, 400, 300, SWP_SHOWWINDOW);
}
}
catch { }
});