Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是什么阻止了第三方物流的发展_C#_Task Parallel Library - Fatal编程技术网

C# 是什么阻止了第三方物流的发展

C# 是什么阻止了第三方物流的发展,c#,task-parallel-library,C#,Task Parallel Library,使用命令模式返回仅休眠5秒的任务,3个任务完成的总时间约为15秒 我在做什么来阻止代码并行执行 呼叫代码 正在执行的命令 命令抽象 命令执行者 问题在于,您不是在实际任务对象中等待,而是在创建任务的方法中等待,然后它才实际提供该任务: protected override void Execute() { new System.Threading.ManualResetEvent(false).WaitOne(5000); Result = Task.Factory.Start

使用命令模式返回仅休眠5秒的任务,3个任务完成的总时间约为15秒

我在做什么来阻止代码并行执行

呼叫代码

正在执行的命令

命令抽象

命令执行者


问题在于,您不是在实际任务对象中等待,而是在创建任务的方法中等待,然后它才实际提供该任务:

protected override void Execute()
{
    new System.Threading.ManualResetEvent(false).WaitOne(5000);

    Result = Task.Factory.StartNew(() => new Dictionary<string, string[]>());
}
应改为:

protected override void Execute()
{
    Result = Task.Factory.StartNew(() =>
    {
        new System.Threading.ManualResetEvent(false).WaitOne(5000);
        return new Dictionary<string, string[]>();
    });
}

你应该在这里发布相关代码。如果你在这里发布的内容太多,那么你应该简化这个例子。我相信在幕后有一个工作项调度程序,它有一个启发式算法,用于确定何时并行运行任务、创建新线程、结束现有线程等。如果你创建1000000个任务,它不会直接创建那么多线程,它找出了如何最好地执行它们,因为这么多线程会杀死CPU。完成一项需要5秒钟的任务可能不是这种启发式方法的最佳选择。有关更多信息,请参阅。1您甚至还没有提供所有代码。您尚未提供CommandExecutor或更多Fakes的定义。我们应该能够复制粘贴这样的示例并运行它。2这里有太多不需要的代码。这其中绝大多数实际上并不重要。使用任务对象的要点是,您不需要这些类型的抽象。@ta.speot.is这不是问题所在。他用一种根本不可能被并行化的方式来编写代码。@Servy Upvots为你投票。@Steve这就是为什么我马上告诉你,你使用了太多不需要的代码。您应该只有一个静态方法,它返回一个任务(基本上是这个方法),但返回任务,然后在该方法的三个实例上返回WaitAll。这就是你需要证明这个问题的全部内容。是的,当问题如此简单时,很容易责怪其他代码。@Steve这就是为什么你应该在发布问题之前尽可能简化代码的原因之一:你可能会发现在这个过程中错误的实际位置。
public abstract class Command
{
    public void Run()
    {
        try
        {
            var timer = new Stopwatch();
            timer.Start();
            //Debug.Print("{0}-{1}", ToString(), "Executing");
            Execute();
            timer.Stop();
            Debug.Print("{0}-{1} Duration: {2}ms", ToString(), "Done", timer.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture));             
        }
        catch (Exception ex)
        {
            Debug.Print("Error processing task:" + ToString(), ex);
        }
    }

    public abstract override string ToString();

    protected abstract void Execute();
}

/// <summary>
/// A command with a return value
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class Command<T> : Command
{
    public T Result { get; protected set; }

    public T GetResult()
    {
        Run();
        return Result;
    }
}
public class CommandExecutor
{
    /// <summary>
    ///     Executes the command.
    /// </summary>
    /// <param name="cmd">The CMD.</param>
    public static void ExecuteCommand(Command cmd)
    {
        cmd.Run();
    }

    /// <summary>
    ///     Executes the command for commands with a result.
    /// </summary>
    /// <typeparam name="TResult">The type of the result.</typeparam>
    /// <param name="cmd">The CMD.</param>
    /// <returns></returns>
    public static TResult ExecuteCommand<TResult>(Command<TResult> cmd)
    {
        ExecuteCommand((Command) cmd);

        return cmd.Result;
    }
protected override void Execute()
{
    new System.Threading.ManualResetEvent(false).WaitOne(5000);

    Result = Task.Factory.StartNew(() => new Dictionary<string, string[]>());
}
protected override void Execute()
{
    Result = Task.Factory.StartNew(() =>
    {
        new System.Threading.ManualResetEvent(false).WaitOne(5000);
        return new Dictionary<string, string[]>();
    });
}