我从编码指南中知道我读过你不该做的
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) 为什么在这部分代码中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) 我正在尝试在 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 这不应该!有没有人对此有解释/解决方案?
我正在.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) foreach(var category in categories) {
a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category)));
}
Run Code Online (Sandbox Code Playgroud)
代码运行正常,但我category在lambda表达式中使用的引用中收到了关于"访问修改后的闭包"的警告.
问题:在这种情况下是否有任何后果的警告?
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)
为什么局部变量过滤?
用户.我遇到了一个我无法找到答案的问题.我是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) 好吧,所以我在这里遇到了一些问题.这是循环.
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.