首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用线程池

使用线程池
EN

Stack Overflow用户
提问于 2012-09-05 16:44:58
回答 3查看 236关注 0票数 0

这是这个问题的后续。

https://stackoverflow.com/questions/12260170/how-to-make-a-threadpool-to-be-nonblocking

我已经用接口实现了它。我已经使用Action/deleages和使用接口使其成为非阻塞的。在.net中有没有其他方法可以使下面的代码非阻塞?接口实现如下。在任何时候,我都应该只有三个函数Main、FuncA和FuncB

如果有人能帮忙的话。这将是真正的感谢。谢谢。

代码语言:javascript
复制
using System;
using System.Threading;

namespace ConsoleApplication2
{
    public interface IOperation
    {
        void CallBack(int i);
    }

    public class FuncBCalculation
    {
        public int N { get { return _n; } }
        private int _n;

        public int MyValue { get; set; }
        public FuncBCalculation(int n)
        {
            _n = n;
        }

        // Wrapper method for use with thread pool.
        public void FuncB(object context)
        {
            IOperation FuncBcallback = (IOperation)context;
            Thread.Sleep(5);
            MyValue = _n + 2;
            FuncBcallback.CallBack(MyValue);
        }
    }

    public class ActualClass : IOperation
    {
        int Finalvalue = 0;
        public static IOperation MainThreadCallBack { get; set; }

        public void FuncA(int input, int i, IOperation callback)
        {
            input += 1;
            var f = new FuncBCalculation(input);
            MainThreadCallBack = callback;
            IOperation op = new ActualClass();
            ThreadPool.QueueUserWorkItem(f.FuncB, op);

        }

        //Method for callback operation
        public void CallBack(int i)
        {
            Finalvalue = i + 3;
            if (MainThreadCallBack != null)
                MainThreadCallBack.CallBack(Finalvalue);
        }
    }


    public class ThreadPoolExample : IOperation
    {
        static void Main()
        {
            ActualClass actualCall;
            const int TotalLoopCount = 1000;
            int input = 11;
            Console.WriteLine("launching {0} tasks...", TotalLoopCount);
            for (int i = 0; i < TotalLoopCount; i++)
            {
                IOperation op = new ThreadPoolExample();
                actualCall = new ActualClass();
                actualCall.FuncA(input, i, op);
            }
            Console.ReadKey();
        }

        //Method for callback operation for the main thread
        public void CallBack(int i)
        {
            Console.WriteLine("The final Result is {0}", i);
        }

    }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-07 20:33:54

代码语言:javascript
复制
public class State
{
    public int input { get; set; }
    public int result { get; set; }
    //public static int ThreadCount { get; set; }
    public bool FuncBSignalON { get; set; }
    //public static bool FuncAThreadON { get; set; }
   //public int TotalLoopCount { get; set; }
    //public int ThreadID { get; set; }
}


public class MainClass
{
    public static void FuncB(Object stateObject)
    {
        State state = stateObject as State;
        state.input += 2;
        state.FuncBSignalON = true;
        ThreadPool.QueueUserWorkItem(new WaitCallback(FuncA), state);
    }

    public static void FuncA(Object stateObject)
    {
        State state = (State)stateObject;
        if (!state.FuncBSignalON)
        {
            state.input += 1;
            ThreadPool.QueueUserWorkItem(new WaitCallback(FuncB), state);
        }
        else
        {
            state.result = state.input + 3;
            //FinalResult.Add(state.result);
            string[] stateResult = new string[1];
            stateResult[0] = state.result.ToString();
            //State.ThreadCount--;
            Main(stateResult);
        }
    }

    static void Main(string[] args)
    {
        if (args.Count() == 0)
        {
            int TotalLoopCount =1000; 
            for (int i = 0; i < TotalLoopCount; i++)
            {
                State FuncAstate = new State();
                FuncAstate.input = 11;
                //FuncAstate.TotalLoopCount = TotalLoopCount;
                //State.ThreadCount++;
                ThreadPool.QueueUserWorkItem(new WaitCallback(FuncA), FuncAstate);
            }
        }
        else
        {
          Console.WriteLine(args[0]);
        }
        Console.ReadKey();
    }

}

终于拿到了。

票数 0
EN

Stack Overflow用户

发布于 2012-09-06 01:58:58

你可以像这样实现它:

代码语言:javascript
复制
class _Program
{
    public static int MyInput { get; set; }

    static void Main(string[] args)
    {
        int input = 11;
        for (int i = 0; i < 1000 ; i++)
        {
            MyInput = input + 1;
            FuncA(delegate(IAsyncResult result)
            {
                AsyncResult<Int32> funcBResult = result as AsyncResult<Int32>;
                Int32 value = funcBResult.EndInvoke() + 3;
                Console.WriteLine("Final value: " + value);
            }, null); ; // using callback method
        }
        Console.ReadLine();
    }

    public static IAsyncResult FuncA(AsyncCallback callback, Object state)
    {
        AsyncResult<Int32> result = new AsyncResult<int>(callback, state);
        ThreadPool.QueueUserWorkItem(FuncB, result);
        return result;
    }

    public static void FuncB(Object asyncResult)
    {
        AsyncResult<Int32> result = asyncResult as AsyncResult<Int32>;
        try
        {
            Int32 value = MyInput + 2;
            result.SetAsCompleted(false, value);
        }
        catch (Exception ex)
        {
            result.SetAsCompleted(false, ex);
        }
    }

}
票数 0
EN

Stack Overflow用户

发布于 2012-09-06 18:24:12

找到了另一个答案,但问题是这里可能会出现顺序混乱的情况。首先,在FuncB中添加1然后添加2,然后在FuncA中再次添加3!有谁能纠正我吗?

代码语言:javascript
复制
public class MainClass
{
    public static List<int> finalResult = new List<int>();

    public static void FuncB(Object stateObject)
    {
            State state = stateObject as State;
            state.result += 2;
            MainClass.finalResult.Add(state.result);
            State.ThreadCount--;
    }

    public static void FuncA(Object stateObject)
    {
        State state = (State)stateObject;
        state.input += 1;
        State.ThreadCount++;
        ThreadPool.QueueUserWorkItem(new WaitCallback(FuncB), state);
        state.result = state.input + 3;
    }

    static void Main()
    {
        int TotalLoopCount = 1000;

        for (int i = 0; i < TotalLoopCount; i++)
        {
            State FuncAstate = new State();
            FuncAstate.input = 11;
            FuncA(FuncAstate);
        }

        while (State.ThreadCount > 0)
        {
            Console.WriteLine("Waiting for all the threads to terminate. Still {0} no of threads available in memory", State.ThreadCount);
            State.ThreadCount--;
            continue;
        }


       for (int i = 0; i < MainClass.finalResult.Count(); i++)
       {
              Console.WriteLine("The final Result {0}", MainClass.finalResult[i]);
        }

        Console.ReadKey();

    }
}
public class State
    {
        //public ManualResetEvent eventWaitHandle { get; set; }
        public int input { get; set; }
        public int result { get; set; }
        public int ThreadID { get; set; }
        //public ThreadStart threadState { get; set; }
        public static int ThreadCount { get; set; }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12277614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档