C #을 사용하는 .NET 4.0에서 Task.Run의 대체 방법은 무엇입니까?
구문 오류 "System.Threading.Tasks.task에 실행에 대한 정의가 포함되어 있지 않습니다."라는이 프로그램이 있습니다.
VB 2010 .NET 4.0을 사용하고 있습니다. 아이디어가 있습니까? .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;
});
}
}
}
당신이 추구하는 것 같습니다 Task.Factory.StartNew<T>
.
return Task.Factory.StartNew<int>(() => {
// ...
return 1;
});
컴파일러가 반환 유형을 추론 할 수 있으므로 다음과 같이 작동합니다.
return Task.Factory.StartNew(() => {
// ...
return 1;
});
읽기 : http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
Task.Run은 기본적으로 4.5에 도입 된 멋진 래퍼라고 설명합니다.
가장 높은 답을 선정 불행하게도, 정확하게 아니라, 올바른 :
불행히도 TaskScheduler를 사용하는 StartNew의 유일한 오버로드는 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);
Task.Factory.StartNew
세부 정보 확인 링크로 코드를 변경했습니다.
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;
});
}
Microsoft.Bcl.Async를 사용하는 경우 여기에 있습니다.
return TaskEx.Run(() =>
{
Console.WriteLine("* starting {0} work", name);
Thread.Sleep(milliseconds);
Console.WriteLine("* {0} work one", name);
return 1;
});
'program tip' 카테고리의 다른 글
키 값을 얻기 위해 URL 문자열을 구문 분석하는 가장 좋은 방법은 무엇입니까? (0) | 2020.10.25 |
---|---|
Xcode에서 새 C ++ 프로젝트를 어떻게 생성합니까? (0) | 2020.10.24 |
NSCoding을 사용하여 사용자 지정 Swift 클래스를 UserDefaults에 저장 (0) | 2020.10.24 |
LINQ Group By Multiple 필드-구문 도움말 (0) | 2020.10.24 |
UTF-8 이메일을 보내는 방법은 무엇입니까? (0) | 2020.10.24 |