标签: taskfactory

Task.Factory.StartNew"action"参数和更高级别的局部变量

考虑一下:

void StartUpdate(DataRequest dataRequest)
{
    Task.Factory.StartNew(request => {... do something with "request" ...}, 
        dataRequest);
}
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是:我可以在lambda表达式中使用dataRequest,而不是将其作为第二个参数传递给StartNew方法吗?我担心的是 - 该方法将在不同的线程上执行,我不确定dataRequest在使用时是否会保持其状态.

c# parallel-processing asynchronous taskfactory

2
推荐指数
1
解决办法
6488
查看次数

多线程进程中的parallel.for或task.startnew

我有一个字符串列表,我需要传递给另一个类中的进程.我想知道这两个想法中哪一个更适合在速度,效率和并行处理方面使用.该列表包含+ - 10000个字符串,我想适当地限制线程,以便一次只运行大约5个线程:

For i as integer = 0 to searchPages.Count - 1
    Parallel.For(0,10,Sub(x)
                        ps.processPage(searchPages.Item(i))
                 End Sub)
Next
Run Code Online (Sandbox Code Playgroud)

任务工厂似乎工作正常但不确定要实施哪个.

For i as integer = 0 to searchPages.Count - 1
    Dim fact as Task=Task.Factory.StartNew(Sub() ps.processPage(searchPages.Item(i)))
    If i = 11 then
           Tasks.Task.WaitAll()
    Endif

Next
Run Code Online (Sandbox Code Playgroud)

任何想法都赞赏.

.net vb.net visual-studio-2010 task-parallel-library taskfactory

2
推荐指数
1
解决办法
1132
查看次数

取消后如何开始任务

我有一个带有三个按钮的 Windows 窗体。一个按钮将条目添加到 BlockingCollection。一个开始处理列表,一个停止处理列表。

我可以将条目添加到我的 BlockingCollection 中,当我单击“开始”时,列表会按照我的预期使用。我仍然可以添加新项目,并且它们会继续被消耗。但是,当我单击停止按钮时,虽然任务确实停止了,但我无法使用开始按钮再次启动它们。

我在取消任务时做错了什么,它们不会重新开始?我已经阅读了无数关于取消任务的文章,但仍然没有“明白”。

任何帮助都会很棒。这是代码...

    // Blocking list for thread safe queuing
    private BlockingCollection<QueueItem> ItemList = new BlockingCollection<QueueItem>();
    private CancellationTokenSource CancelTokenSource = new CancellationTokenSource();
    private int MaxConsumers = 3;

    // Form initialisation
    public MainForm()
    {
        InitializeComponent();
    }

    // Create an async consumer and add to managed list
    private void CreateConsumer(int iIdentifier)
    {
        Task consumer = Task.Factory.StartNew(() =>
        {
            foreach (QueueItem item in ItemList.GetConsumingEnumerable())
            {
                Console.WriteLine("Consumer " + iIdentifier.ToString() + ": PROCESSED " + item.DataName);
                Thread.Sleep(894);

                if …
Run Code Online (Sandbox Code Playgroud)

c# multithreading winforms taskfactory

2
推荐指数
1
解决办法
3165
查看次数

TaskFactory新UI创建

如何使用TaskFactory创建新的UI元素?当我尝试时,我收到以下错误:

调用线程必须是STA,因为许多UI组件都需要这个.

示例代码

Dim txtBoxList as new List(Of TextBox)

Sub StartThread()
    Dim TS As TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
    Task.Factory.StartNew(Sub() CreateControl(), TS)
End Sub

Sub CreateControl()
    Dim txtBox As New TextBox
    Dispatcher.BeginInvoke(Sub() txtBoxList.Add(txtBox))
End Sub
Run Code Online (Sandbox Code Playgroud)

vb.net wpf taskfactory

2
推荐指数
1
解决办法
697
查看次数

在c#中同时运行相同方法的多个实例而不会丢失数据?

我真的不太了解任务和线程.我在嵌套的三个级别中有一个方法for,我希望在不同的线程/任务中多次运行,但是我传递给方法的变量变得疯狂,让我用一些代码解释一下:

List<int> numbers=new List<int>();
for(int a=0;a<=70;a++)
{
  for(int b=0;b<=6;b++)
  {
    for(int c=0;b<=10;c++)
    {
        Task.Factory.StartNew(()=>MyMethod(numbers,a,b,c));
    }
  }
}
private static bool MyMethod(List<int> nums,int a,int b,int c)
{
    //Really a lot of stuff here
}
Run Code Online (Sandbox Code Playgroud)

这是嵌套,myMethod确实做了很多事情,比如计算一些数字的阶乘,写入不同的文档和匹配响应与组合列表并调用其他小方法,它也有一些返回值(布尔值),但我此刻不要关心他们.问题是没有任务达到目的,就像每次嵌套调用它自己刷新的方法一样,删除以前的实例.它还会给出一个错误,"尝试除以0",其值超过由FORs分隔的值,例如a=71, b=7, c=11所有变量都为空(这就是除以零的原因).我真的不知道如何解决它.

c# task task-parallel-library taskfactory

1
推荐指数
1
解决办法
3463
查看次数

使用任务工厂和回调创建异步方法

我开始创建一些将触发异步操作的类,我希望客户端注册一个回调来接收一些结果.最后我达到了以下代码.这只是一个例子,我想知道是否有更好的方法来使用TaskFactoryAction<>, Func<>

这是客户端的基本示例:

Client client2 = new Client();
client2.GetClientList(ClientCallBack);


private static void ClientCallBack(List<Client> listado)
{ 
  //Receive the list result and do some stuff in UI      
}
Run Code Online (Sandbox Code Playgroud)

这是Client类的GetCLientList异步示例:

public void GetClientList(Action<List<Client>> Callback)
{
  List<Client> listado=null;

  Task.Factory.StartNew(() =>
    {
      listado = new List<Client>{
        new Client{ apellidos="Landeras",nombre="Carlos",edad=25},
        new Client{ apellidos="Lopez", nombre="Pepe", edad=22},
        new Client{ apellidos="Estevez", nombre="Alberto", edad=28}
      };

    //Thread.Sleep to simulate some load
    System.Threading.Thread.Sleep(4000);
  }).ContinueWith((prevTask) =>
    {
      Callback(listado);
    }
  );
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?我知道我可以Task从我的函数返回并continueWith在客户端注册,但我想将它包装在类中.

编辑

我发布了另一个例子.我试图制作 …

c# asynchronous taskfactory

1
推荐指数
1
解决办法
8004
查看次数

使TaskScheduler同步并在主线程中运行

我正在寻找一种方法来创建在主线程中同步运行的 TaskScheduler,以允许将 WPF 应用程序配置为单线程以进行调试。

任何想法?

现在,我正在使用 MSDN 上的示例LimitedTaskScheduler,它允许指定并发级别(使用多少个线程),并使用此扩展在应用程序启动之前设置静态 TaskFactory:

void SetOnTaskFactory(TaskFactory taskFactory)
{
    const BindingFlag = BindingFlags.Static | BindingFlags.NonPublic
    var field = typeof(Task).GetField("s_factory", BindingFlag);
    field.SetValue(null, taskFactory);
}
Run Code Online (Sandbox Code Playgroud)

c# wpf asynchronous taskfactory async-await

1
推荐指数
1
解决办法
4081
查看次数

如何将 TaskFactory.StartNew&lt;Task&lt;Result&gt;&gt; 与异步方法一起使用?

我有一个 async Func<> ,我在其中“等待”异步方法。我想使用 TaskFactory.StartNew 对 Func<> 进行大量并行调用,如下面的代码,但出现以下错误:

转换'System.Threading.Tasks.Task<System.Threading.Tasks.Task<Result>>'为错误'System.Threading.Tasks.Task<Result>'

如何并行调用异步方法?

Func<object, Task<Result>> action = async (object m) =>
{
    try
    {
        return await Send<Message, Result>(m as Message);
    }
    catch (Exception exc)
    {
        Result result = new Result();
        (result as ResponseBaseDto).Success = false;
        (result as ResponseBaseDto).ErrorList = new List<Entities.Common.ErrorDto>()
        {
            new Entities.Common.ErrorDto{ Code = 9999, Message = exc.Message }
        };
        return result;
    }
};

// Error on request.ForEach
request.ForEach(r => sending.Add(taskFactory.StartNew<Task<Result>>(action, r)));
var tareas = sending.ToArray();
await Task.WhenAll(tareas); …
Run Code Online (Sandbox Code Playgroud)

c# multithreading asynchronous taskfactory

1
推荐指数
1
解决办法
1632
查看次数