1

C# .Net4.0 を使用して Visual Studio 2010 でプログラムを構築しています。

URLを取り込んで応答を取得しようとする関数があります。関数内で、成功とエラーを示すログ ファイルに書き込みます。

public void getResponse(string url, System.IO.StreamWriter writer)
{
    try
    {
        WebRequest request = WebRequest.Create(url);
        WebResponse response = request.GetResponse();

        // Display the status.
        Console.WriteLine(response.Headers);
        writeToLog("Success: " + url, writer);
    }
    catch (WebException ex)
    {
        writeToLog("Error: " + ex.message, writer);
    }
}

URL のリストがあり、Parallel.ForEach を使用して一度に複数の URL を実行します。

System.IO.StreamWriter writer = new System.IO.StreamWriter("program.log", true);
string[] urls = {url1, url2, url3, url4, etc}; //have around 30 urls
Parallel.ForEach(urls, url => getResponse(url, writer));

プログラムを実行すると、program.log が別のプログラムによって使用されているというエラーが表示されることがあります。これは常に発生するわけではありませんが、まれに発生し、プログラムがクラッシュします。

質問:このエラーを回避するにはどうすればよいですか? または、それを行う別の方法はありますか?

4

1 に答える 1

2

StreamWriter はスレッド セーフではないため、lock ステートメントを使用して書き込み手順をロックし、他のスレッドがその行に入って競合が発生しないようにします。 v=vs.100).aspx

于 2013-07-09T20:40:43.477 に答える