考虑一下:
void StartUpdate(DataRequest dataRequest)
{
Task.Factory.StartNew(request => {... do something with "request" ...},
dataRequest);
}
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是:我可以在lambda表达式中使用dataRequest,而不是将其作为第二个参数传递给StartNew方法吗?我担心的是 - 该方法将在不同的线程上执行,我不确定dataRequest在使用时是否会保持其状态.
我有一个字符串列表,我需要传递给另一个类中的进程.我想知道这两个想法中哪一个更适合在速度,效率和并行处理方面使用.该列表包含+ - 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
我有一个带有三个按钮的 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) 如何使用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) 我真的不太了解任务和线程.我在嵌套的三个级别中有一个方法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所有变量都为空(这就是除以零的原因).我真的不知道如何解决它.
我开始创建一些将触发异步操作的类,我希望客户端注册一个回调来接收一些结果.最后我达到了以下代码.这只是一个例子,我想知道是否有更好的方法来使用TaskFactory和Action<>, 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在客户端注册,但我想将它包装在类中.
编辑
我发布了另一个例子.我试图制作 …
我正在寻找一种方法来创建在主线程中同步运行的 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) 我有一个 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) taskfactory ×8
c# ×6
asynchronous ×4
vb.net ×2
wpf ×2
.net ×1
async-await ×1
task ×1
winforms ×1