0

別のメソッド内に次のコードがあるとします。

Parallel.For(0, pageCount, 
             page =>
             {
                 var request = (HttpWebRequest)WebRequest.Create(
                                string.Format(url, 
                                    selectedRegion["id"].InnerText, page));
                 request.BeginGetResponse(
                     new AsyncCallback(FinishRequestRegion), request);
              });

そして、これは予想される応答のコールバックです。

void FinishRequestRegion(IAsyncResult res)
        {
            try
            {
                var response = (res.AsyncState as HttpWebRequest).EndGetResponse(res) as HttpWebResponse;
                var docCitizens = new XmlDataDocument();
                var readerCitizens = new XmlTextReader(response.GetResponseStream());

                readerCitizens.MoveToContent();
                docCitizens.Load(readerCitizens);
                readerCitizens.Close();

                if (docCitizens["error"]!=null)
                    return;

                var selectedRegion = docCitizens["region"];
                var regionCitizens = selectedRegion["citizens"];

                var result = (regionCitizens.Cast<XmlNode>().Select(citizen => citizen["id"].InnerText)).ToList();

                File.AppendAllLines("list.txt",  result);

            }
            catch (Exception ex)
            {
                return;
            }

        }

2 つの応答が同時にファイルに書き込もうとすると、エラーが発生します (「別のプロセスがファイルにアクセスしています」という従来のメッセージ)。ファイルのロックが解除されるのを待って、そこに必要な情報を記録できるようにするにはどうすればよいですか?

4

1 に答える 1

0

何かをロックする必要があります:

object fileLock = new object();

void FinishRequestRegion(IAsyncResult res)
        {
            try
            {
                ...
                lock(fileLock)
                   File.AppendAllLines("list.txt",  result);

            }
            catch (Exception ex)
            {
                return;
            }

        }
于 2012-09-09T21:44:07.397 に答える