0
Я попытался этоParallel.Invoke выполняет первый метод только
Parallel.Invoke(() => Method1(),() => Method2());
начать method1 & Method2 воздействующий в то же время. Но Метод1 только получает выполнение. Любое решение, пожалуйста.
В продолжение this, я добавил код ниже.
class Program
{
static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
Task.Factory.StartNew(() => { Thread.Sleep(5000); cts.Cancel(); });
ProcessFiles(cts.Token);
Console.ReadKey();
}
public static void ProcessFiles(CancellationToken cts)
{
try
{
LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(2);
List<Task> tasks = new List<Task>();
TaskFactory factory = new TaskFactory(lcts);
Parallel.Invoke(
() => Method1(cts, tasks, factory),
() => Method2(cts, tasks, factory));
Task.WaitAll(tasks.Where(t => t != null).ToArray());
Console.WriteLine("\n\nSuccessful completion.");
Console.ReadLine();
}
catch (AggregateException aex)
{
// Ignore
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private static void Method1(CancellationToken cts, List<Task> tasks, TaskFactory factory)
{
for (int i = 0; i < 1000; i++)
{
int i1 = i;
var t = factory.StartNew(() =>
{
Console.WriteLine("Method 1 --- {0} --- {1}", i1, GetGuid());
}, cts);
tasks.Add(t);
}
}
private static void Method2(CancellationToken cts, List<Task> tasks, TaskFactory factory)
{
for (int i = 0; i < 1000; i++)
{
int i1 = i;
var t = factory.StartNew(() =>
{
Console.WriteLine("Method 2 --- {0} --- {1}", i1, GetGuid());
}, cts);
tasks.Add(t);
}
}
private static Guid GetGuid()
{
Thread.Sleep(TimeSpan.FromSeconds(1));
return Guid.NewGuid();
}
}
O/P: Используется только метод1. Метод2 - нет.
Метод 1 представляет собой очередность задач, прежде чем метод 2 получит шанс. Затем вы заканчиваете работу до того, как задания Method 2 даже начнутся. Поместите некоторые Console.WriteLines (или Thread.Sleep()) прямо перед 'factory.StartNew()', и это приведет к задержке, достаточной для того, чтобы вы могли смешивать метод 2. – Rob
Роб прав - но есть некоторые другие вопросы. Кроме того, загляните в Task.Delay и обратите внимание, что сравнение cts с null неверно (это struct - это никогда не null) - вы, вероятно, имеете в виду что-то вроде cts.ThrowIfCancellationRequested –
Я могу видеть оба метода после добавления Console.WriteLines (или Thread. Спать()). Спасибо –