如何同步和写入所有文本?

时间:2013-05-28 15:58:16

标签: c# multithreading locking semaphore

来自文本文件的多线程围栅线,然后在收到写入另一个文本文件的肯定响应后,发送一个请求表格post \ get到该数据。

public int index = -1;
public int count = 1000;

private static readonly object SyncIndex = new object();
private static readonly object SyncFiles = new object();

public void CreateThreads(int threads)
{
    Thread[] threadArray;
    for (int i = 0; i < (threadArray = new Thread[threads]).Length; i++)
    {
        threadArray[i] = new Thread(this.Run) { IsBackground = true };
        threadArray[i].Start();
    }
}


public void Run()
{
    while (true)
    {
      lock(SyncIndex) { index++;}
      //if (index > count) { break; }
      string resp = Check(index.ToString());

      lock (SyncFiles)
      {
          if (resp == "true")
          {
              SaveText("good.txt", index.ToString());
          }
          else
          {
              SaveText("bad.txt", index.ToString());
          }
      }

    }
 }

public string Check(string login)
{
    try
    {
        System.Net.WebRequest reqGET = System.Net.WebRequest.Create(@"http://www.minecraft.net/haspaid.jsp?user=" + login);
        System.Net.WebResponse resp = reqGET.GetResponse();
        System.IO.Stream stream = resp.GetResponseStream();
        System.IO.StreamReader sr = new System.IO.StreamReader(stream);
        string s = sr.ReadToEnd();

        if (s.Contains("true"))
        {
            return "true";
        }
        else
        {
            return "false";
        }
    }
    catch
    {
        Check(login);
    }
    return "";
}

//static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
private static void SaveText(string file, string text)
{
    //cacheLock.EnterWriteLock();
    try
    {
        var write = new StreamWriter(file, true);
        write.WriteLine(text);
        write.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    //finally
    //{
    //    cacheLock.ExitWriteLock();
    //}
}

private void btStart_Click(object sender, EventArgs e)
{
    CreateThreads(300);
}

什么是问题? count = 1000 线程= 300

bad.txt
299
300
301
302
303
304
305
306
307
308
310
311
312
313
314
315
316

good.txt
309

为什么文字从300开始? 我哪里出错??????

1 个答案:

答案 0 :(得分:1)

首先,我建议不要为每个工作项启动一个线程。使用Parallel.For而不是自己创建线程。

这不仅可以防止错误(您可以直接使用索引),而且还可以更有效地实现负载平衡。

话虽如此,你的问题是你在每个线程中使用相同的变量。你需要做一个临时的:

int localIndex;
lock(SyncIndex) 
{ 
    index++;
    localIndex = index; // Copy this here, before another thread can change it
}

// Use localIndex, not index, from here on...

在当前代码中,您同步索引的增量,但其他线程仍将“更改”其值,然后才能使用它。