0

我想创建一个线程安全的方法,我可以从多个工作人员调用而不会阻塞工作线程。我还希望代码简洁得像 InvokeRequired->BeginInvoke 类型代码用于 UI 控件...当然,Control在这种情况下我没有使用 a,该方法位于自定义类上。我也不一定要对每种方法都这样做。那么这是可以在自定义类/方法上轻松实现的东西吗?

须藤代码:

class foo
{
    //Fields
    Context MyContext;
    List<T> UnsafeList = new List<T>();

    //Method
    public void MyMethod(int someArg, Item someOtherArg)
    {
        if (!MyContext)
        {
            MyContext.BeginInvoke(...);
            return; //Calling thread returns
        }
        else
        {
            UnsafeList.Add(someOtherArg);
            return; //MyContext Thread returns
        }
    }

    //Constructor
    public foo()
    {
        MyContext = new GetSomeThreadHandle();
    }
}

我想我知道如何使用自定义 EventArgs 做到这一点,但它涉及几乎重复的代码,我正在寻找更通用/更清洁的解决方案。

编辑

这是使用 C# .Net 4.0

4

2 回答 2

3

鉴于:

  • 您正在使用 .NET 4
  • 您提到对请求进行排队序列化...

...听起来你想要一个生产者/消费者队列,通过BlockingCollection<T>. 启动一个将从队列中拉出的线程(消费者),然后从您的工作线程中添加到队列中。

如果队列累积到意外/不希望的水平,您需要考虑想要发生的情况。(你可以阻止,你可以抛出一个异常,你可以放弃请求。)

编辑:有关详细信息,请参阅此 MSDN 博客文章BlockingCollection<T>

于 2013-01-22T15:54:28.630 回答
0

演示应用于您的任务的生产者/消费者方式的小例子

public void produceConsume()
{
    var results = new BlockingCollection<double[]>();

    var producer = Task.Factory.StartNew(() =>
    {
        for (int i = 0; i < 100; i++)
        {
            var data = new double[1024];
            results.Add(data);                    
        }

        results.CompleteAdding();
    });

    var consumer = Task.Factory.StartNew(() =>
    {
        foreach (var item in results.GetConsumingEnumerable())
        {
           // put in chart
        }
    });

    producer.Wait();
}

如果您需要更多的消费者消耗所有数据,您也可以使用 ConcurrentQueue

于 2013-01-22T16:27:48.407 回答