Один вариант, который вы могли бы рассмотреть, заключается в том, чтобы консольные приложения перенаправляли свой доступ к файлу через службу, таким образом, есть только один процесс, обращающийся к файлу, и вы можете синхронизировать доступ к нему там.
Одним из способов реализации этого является удаленное взаимодействие по каналу IPC (а вот другой пример от weblogs.asp.net). Мы использовали эту технику в проекте для компании, в которой я работаю, и она работает хорошо, в нашем конкретном случае .net WebService предоставляет способ связи со службой Windows, работающей на той же машине.
Пример на основе примера weblogs.asp.net
По сути, вам нужно создать следующий код: создать решение, добавить два консольных приложения (одно называется «Сервер», другое - «Клиент» и одну библиотеку). Добавьте ссылку на библиотеку в оба консольных приложения, вставьте приведенный ниже код и добавьте ссылку на System.Runtime.Remoting на сервер и консоль.
Запустите приложение сервера, затем запустите приложение клиента. Обратите внимание на тот факт, что серверное приложение имеет сообщение, переданное ему клиентом. Вы можете распространить это на любое количество сообщений / задач
// Server:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
namespace RemotingSample
{
public class Server
{
public Server()
{
}
public static int Main(string[] args)
{
IpcChannel chan = new IpcChannel("Server");
//register channel
ChannelServices.RegisterChannel(chan, false);
//register remote object
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(RemotingSample.RemoteObject),
"RemotingServer",
WellKnownObjectMode.SingleCall);
Console.WriteLine("Server Activated");
Console.ReadLine();
return 0;
}
}
}
// Client:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
using RemotingSample;
namespace RemotingSample
{
public class Client
{
public Client()
{
}
public static int Main(string[] args)
{
IpcChannel chan = new IpcChannel("Client");
ChannelServices.RegisterChannel(chan);
RemoteObject remObject = (RemoteObject)Activator.GetObject(
typeof(RemotingSample.RemoteObject),
"ipc://Server/RemotingServer");
if (remObject == null)
{
Console.WriteLine("cannot locate server");
}
else
{
remObject.ReplyMessage("You there?");
}
return 0;
}
}
}
// Shared Library:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
namespace RemotingSample
{
public class RemoteObject : MarshalByRefObject
{
public RemoteObject()
{
Console.WriteLine("Remote object activated");
}
public String ReplyMessage(String msg)
{
Console.WriteLine("Client : " + msg);//print given message on console
return "Server : I'm alive !";
}
}
}