相关疑难解决方法(0)

Foreach循环和任务

我从编码指南中知道我读过你不该做的

for (int i = 0; i < 5; i++) 
{ 
    Task.Factory.StartNew(() => Console.WriteLine(i));
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

因为它会写5 5,我明白了,我想我明白为什么会这样.我知道解决方案就是做

for (int i = 0; i < 5; i++) 
{ 
    int localI = i;
    Task.Factory.StartNew(() => Console.WriteLine(localI));
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

不过这样的事可以吗?

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction());
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

或者我需要做与在for循环中所做的相同的事情.

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass;
    Task.Factory.StartNew(() => localMyClass.DoAction());
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

foreach .net-4.0 task

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

变量缓存

为什么在这部分代码中complete被缓存?

static void Main()
{
  bool complete = false; 
  var t = new Thread (() =>
  {
    bool toggle = false;
    while (!complete) toggle = !toggle;
  });
  t.Start();
  Thread.Sleep (1000);
  complete = true;
  t.Join();        // Blocks indefinitely
}
Run Code Online (Sandbox Code Playgroud)

但在这部分不是吗?

static void Main()
{
  bool complete = false;
  bool toggle = false; 
  var t = new Thread (() =>
  {
    while (!complete) toggle = !toggle;
  });
  t.Start();
  Thread.Sleep (1000);
  complete = true;
  t.Join();  
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading

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

在 C# 中的 for 循环中使用任务时出现 IndexOutOfRangeException 异常

我正在尝试在 for 循环中使用任务,但我遇到了非常奇怪的异常!这是我的代码:

        Task[] tasks = new Task[strarrFileList.Length];
        for (int ii = 0; ii < strarrFileList.Length; ii++)
        {
            tasks[ii] = Task.Factory.StartNew(() => mResizeImage2(ii, strarrFileList[ii], intLongSide, jgpEncoder, myEncoderParameters));
        }
        Task.WaitAll(tasks);
Run Code Online (Sandbox Code Playgroud)

这是错误:

mCPanel.exe 中出现“System.IndexOutOfRangeException”类型的异常,但未在用户代码中处理附加信息:索引超出数组范围。

所以基本上 ii 变得等于 strarrFileList.Length 这不应该!有没有人对此有解释/解决方案?

c# loops task

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

C# - 索引超出了数组的边界,在for循环中使用相同的列表大小

我正在.NET中创建一个文件下载器,它使用异步任务从服务器下载文件数组.但是,即使我创建Task[]并返回string[]相同的长度.

这是我的方法:

    public static string[] DownloadList(string[] urlArray, string[] toPathArray, string login = "", string pass = "", bool getExt = false)
    {
        Console.WriteLine("DownloadList({0}, {1}, {2}, {3}, {4})", urlArray, toPathArray, login, pass, getExt);
        try {
            returnedArray = new string[urlArray.Length];
            Task[] taskArray = new Task[urlArray.Length];
            for (int i = 0; i < urlArray.Length; i++)
            {
                Thread.Sleep(1000);
                Console.WriteLine("i = {0}", i);
                Task task = new Task(() => { returnedArray[i] = Download(urlArray[i], toPathArray[i], login, pass, getExt, true); });
                task.Start();
                taskArray[i] …
Run Code Online (Sandbox Code Playgroud)

.net c# arrays asynchronous task

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

访问Lambda表达式中的Modified Closure

foreach(var category in categories) {
    a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category)));
}
Run Code Online (Sandbox Code Playgroud)

代码运行正常,但我category在lambda表达式中使用的引用中收到了关于"访问修改后的闭包"的警告.

问题:在这种情况下是否有任何后果的警告?

c# linq lambda closures

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

为什么局部变量?

resharper让我把它变成一个局部变量,写下"访问修改后的闭包"

if (filter != null)
{
    if (filter.CityId != 0)
    {
        ads = ads.Where(x => x.Ad.CityId == filter.CityId);
    }
    if (filter.BusinesCategoryId != 0)
    {
        ads = ads.Where(x => x.BusinessCategoryId == filter.BusinesCategoryId);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么局部变量过滤?

c# linq filter

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

线程:不正确的变量传递C#

用户.我遇到了一个我无法找到答案的问题.我是Threading的新手(在C#中),遇到了这个问题.我有这个带有效果的图像编辑器,但由于它运行得太慢,我试图将其拆分为线程.问题是他总是使用效果列表中的最后一项运行"CreatePreview"命令.因此,如果我激活了效果:"黑/白","Sature"和"GreenFilter",它将尝试使用greenfilter创建3个预览.

任何人都可以帮我解决这个问题吗?

private void CreatePreviews(string fileName, List<IEffect> effects)
{
    List<Task> tasks = new List<Task>();
    foreach (var effect in effects)
    {
        //previews.Add(effect, CreatePreview(fileName, effect));
        Task task = new Task(delegate()
        {
            string result = CreatePreview(fileName, effect);
            Dispatcher.BeginInvoke(new Action(
            delegate()
            {
                ShowPreview(result, effect.DisplayName);
            }));

        });
        task.Start();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# variables multithreading

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

c#foreach with Action.BeginInvoke

好吧,所以我在这里遇到了一些问题.这是循环.

lock (ClientLocker)
{
    Trace.WriteLine("#WriteAll: " + sm.Header);
    foreach (Client c in Clients)
    {
        if (c.LoggedIn)
        {
            Trace.WriteLine("#TryWriteTo[" + c.Id + "](" + sm.Header + ")");
            LazyAsync.Invoke(() => c.WriteMessage(sm));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是LazyAsync

public static class LazyAsync
{
    public static void Invoke(Action a)
    {
        a.BeginInvoke(a.EndInvoke, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

每个Client包含一个socket,所以我不能Clone这么做.问题是,当我执行Invoketo时c.WriteMessage,由于执行被延迟,它通常不会触发列表中的第一对,并且有时实际上只会在最后一项上触发一大堆.

我知道这与c是一个在Invoke实际被调用之前发生变化的引用有关,但有没有办法避免这种情况?

执行一般for(int i=0 etc循环似乎无法解决此问题.

任何人对我如何解决这个问题都有任何想法?

记住,不能Clone Client.

c# concurrency delegates action invoke

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