program tip

C #을 사용하는 .NET 4.0에서 Task.Run의 대체 방법은 무엇입니까?

radiobox 2020. 10. 24. 10:00
반응형

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.Run4.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;
});

참고 URL : https://stackoverflow.com/questions/17607048/what-is-a-replacement-method-for-task-run-in-net-4-0-using-c

반응형