1

クッキーファイルを取得して読み取ることになっている数行にロックをかけましたが、ファイルがすでに使用されているというエラーが表示されることがあります。何がうまくいかないのかわからない...

コード:

private Object cookieLock = new Object();

main{
    for (int j = 0; j < maxThreads; j++)
        {
            //   Thread thread = new Thread(new ThreadStart(startPosting2(worker)));
            Thread thread = new Thread(() => postingFunction2());
            thread.IsBackground = true;
            thread.Start();
        }
    }

public void postFunction2()
{
 string tmpUsername = string.Empty;
 string[] array2 = null;
   try
    {
      lock (cookieLock)
       {
          array2 = File.ReadAllLines(tmpUsername + ".txt");
       }
    }
   catch(Exception ex)
    {
      TextWriter sUrl = new StreamWriter("readingSameCookieFile.txt", true);
      sUrl.WriteLine(exp.ToString());
      sUrl.Close();
    }
}

私は何か間違ったことをしていますか?これらの行は20〜100スレッドで同時に実行されます。あまり表示されませんが、しばらくは表示されるので、なぜだろうと思います。

TXTファイルエラー:

System.IO.IOException:別のプロセスで使用されているため、プロセスはファイルにアクセスできません'C:\Users\Administrator\My Projects\Bot Files\2 Message Poster Bot\MessagePoster - NoLog - Copy\cookies\LaureneZimmerebner57936.txt'

4

3 に答える 3

1

ファイルを1回だけ読み取り、20〜100スレッド間で共有することをお勧めします。これは、ファイルarray2を複数回読み取るとパフォーマンスが低下するためです。また、マルチスレッド環境では、すべてのI/O操作をシングルスレッドに保つことをお勧めします。

array2を共有する場合、すべてのスレッドによってのみ読み取られる場合は、ロックは必要ありません。

Debug.Write(file name);// to make sure each thread opens different file.
于 2012-09-01T07:13:52.590 に答える
1

あなたはクッキーを読み込もうとしています。ブラウザまたはコード外のその他のアプリケーションがCookieファイルにアクセス/書き込みしている可能性があるため、例外です。

コード全体を投稿していないので、ロックオブジェクトが複数回インスタンス化されていないことを確認するか、静的にしてください。また、読んだ後にThread.Sleep(0)を追加してみてください。それが役立つかどうかを確認してください。

array2の内容を別のファイルに書き込む場合は、書き込み後に正しく破棄/クローズされていることを確認してください。

メソッド全体をロックブロック内に配置してみてください

public void postFunction2() 
{ 
 lock (cookieLock) 
 { 
 string tmpUsername = string.Empty; 
 string[] array2 = null; 
   try 
    { 
          array2 = File.ReadAllLines(tmpUsername + ".txt"); 
    } 
   catch(Exception ex) 
    { 
      TextWriter sUrl = new StreamWriter("readingSameCookieFile.txt", true); 
      sUrl.WriteLine(exp.ToString()); 
      sUrl.Close(); 
    } 
  }
} 
于 2012-09-01T07:43:50.230 に答える
0

発生している問題を克服したいだけで、それが書き込まれていないことが確実な場合は、の代わりにこの関数を使用できますFile.ReadAllLines。重要なのは、それが提供する共有オプションFileShare.ReadWriteです。

private static string[] ReadAllLines(string fileName)
{
  using (var fs = new FileStream(fileName, FileMode.Open,
                                           FileAccess.Read,
                                           FileShare.ReadWrite))
  {
    var reader = new StreamReader(fs);
    //read all at once and split, or can read line by line into a list if you prefer
    var allLines = reader.ReadToEnd().Split(new string[] { "\r\n", "\r", "\n" },
                                            StringSplitOptions.None);
    return allLines;
  }
}
于 2012-09-01T08:28:09.930 に答える