3

次のサンプル コードでは、C: ドライブに作成されたログ ファイル "ParallelLog.txt" が表示されません。(大量のコードで申し訳ありません!)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;

namespace Logger
{
    internal class Program
    {
        static List<Employee> employees = new List<Employee>()
        {
            new Employee{Name = "William", Age=30, RollNo=1234},
            new Employee{Name = "Martin", Age=29, RollNo=1235},
            new Employee{Name = "Richard", Age=28, RollNo=1236},
            new Employee{Name = "Baldwin", Age=27, RollNo=1237}
        };

        static void Main(string[] args)
        {
            Task task = Task.Factory.StartNew(() =>
            {
                foreach (Employee employee in employees.AsParallel().AsOrdered())
                {
                    WriteToLog(employee);
                }
            });
        }

        public static void WriteToLog(Employee employee)
        {            
            static string fileName = @"C:\ParallelLog.txt";
            private static object lockObject = new object();

            lock (lockObject)
            {
                StreamWriter writer = new StreamWriter(fileName, true);
                writer.WriteLine("{0} - {1} - {2}", employee.Name, employee.Age, employee.RollNo);
                writer.Close();
                writer.Dispose();
                writer = null;
            }
        }
    }

    internal class Employee
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public int RollNo { get; set; }
    } 
}

上記のコードに何か問題がありますか? このサンプルは、実際のプロジェクトのログ ファイル作成プロセスのベースです。

4

1 に答える 1

2

以下のコードを試してください

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;

namespace Logger
{
    internal class Program
    {
        static List<Employee> employees = new List<Employee>()
        {
            new Employee{Name = "William", Age=30, RollNo=1234},
            new Employee{Name = "Martin", Age=29, RollNo=1235},
            new Employee{Name = "Richard", Age=28, RollNo=1236},
            new Employee{Name = "Baldwin", Age=27, RollNo=1237}
        };

        static void Main(string[] args)
        {
            Task task = Task.Factory.StartNew(() =>
            {
                WriteToLog();
            });
        }

        public static void WriteToLog()
        {            
            static string fileName = @"C:\ParallelLog.txt";
            using (StreamWriter writer = new StreamWriter(fileName, true))
            {
                foreach (Employee employee in employees.AsParallel().AsOrdered())
                    writer.WriteLine("{0} - {1} - {2}", employee.Name, employee.Age, employee.RollNo);
            }
        }
    }

    internal class Employee
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public int RollNo { get; set; }
    } 
}

この場合、a を使用する必要はありませんlockStreamWriterこれは、オブジェクトの連続インスタンス化を 1 つだけに削除します。usingここでは、キーワードによって処理されるため、管理について心配する必要はありません。クラスの推奨される使用方法については、 MSDNを参照してください。StreamWriter

これが役立つことを願っています。

于 2013-07-04T11:29:29.243 に答える