У меня есть программа, которая парсит данные с сайта и сохраняет их по одному экземпляру в файлы f1.json , f2.json и f3.json c некоторой задержкой. Во время начала сохранения она создает файл ".locker" для каждого файла (f1,f2,f3) т.е создается 1.locker, 2.locker, 3.locker. После того как экземпляр был сохранен файл конкретный файл ".locker" удаляется. Мой Windows-service должен реагировать на удаление этого файла и парсить json, а затем сохранять в базу данных, но он читает json и почему-то не сохраняет в базу данных. RecordEntry служит для проверки прочтен ли json. В итоге RecordEntry отрабатывает нормально и записывает в txt файл, а сontext..add(someObj) context.savechanges не работают и никаких исключений не выкидывают. Если повторить парсинг и добавление в консольном приложении, то все работает, но мне нужен winserv. p.s ".locker" служит в роли монитора для потоков в программе парсер, а ".Slocker" в роли мониторов для процессов т.е они говорят о том, что данный файл сейчас занят каким-либо потоком или процессом.
public partial class WinServParseJson : ServiceBase
{
Watcher w;
public WinServParseJson()
{
InitializeComponent();
this.CanStop = true;
this.CanPauseAndContinue = true;
this.AutoLog = true;
}
protected override void OnStart(string[] args)
{
w = new Watcher();
Thread wThread = new Thread(new ThreadStart(w.Start));
wThread.Start();
}
protected override void OnStop()
{
w.Stop();
}
}
public class Watcher
{
FileSystemWatcher watcher;
object locker = new object();
bool enabled = true;
WorkWithJson js;
//MyDbContext context = new MyDbContext();
public Watcher()
{
watcher = new FileSystemWatcher("C:\\Users\\badyi\\source\\repos\\OS_homework4\\VKParser\\VKParser\\bin\\Debug");
watcher.Deleted += Watcher_Deleted;
js = new WorkWithJson();
}
private void RecordEntry<T>(T input)
{
lock (locker)
{
using (StreamWriter writer = new StreamWriter("C:\\templog.txt", true))
{
writer.WriteLine($"{input}");
}
}
}
private void Watcher_Deleted(object sender, FileSystemEventArgs e)
{
string filePath = e.FullPath;
if (filePath == "C:\\Users\\badyi\\source\\repos\\OS_homework4\\VKParser\\VKParser\\bin\\Debug\\1.locker")
{
FileStream setlock = new FileStream("1.Slocker", FileMode.OpenOrCreate);
using (var context = new MyDbContext())
{
TextPost tp = js.read<TextPost>(1);
context.id_texts.Add(tp);
context.SaveChanges();
setlock.Close();
RecordEntry<TextPost>(tp);
File.Delete("1.Slocker");
}
}
else if (filePath == "C:\\Users\\badyi\\source\\repos\\OS_homework4\\VKParser\\VKParser\\bin\\Debug\\2.locker" )
{
FileStream setlock = new FileStream("2.Slocker", FileMode.OpenOrCreate);
using (var context = new MyDbContext())
{
LinkPost lp = js.read<LinkPost>(2);
context.id_links.Add(lp);
context.SaveChanges();
setlock.Close();
File.Delete("2.Slocker");
RecordEntry<LinkPost>(lp);
}
}
else if (filePath == "C:\\Users\\badyi\\source\\repos\\OS_homework4\\VKParser\\VKParser\\bin\\Debug\\3.locker")
{
FileStream setlock = new FileStream("3.Slocker", FileMode.OpenOrCreate);
using (var context = new MyDbContext())
{
ImgPost ip = js.read<ImgPost>(3);
context.id_imglinks.Add(ip);
context.SaveChanges();
setlock.Close();
File.Delete("3.Slocker");
RecordEntry<ImgPost>(ip);
}
}
}
public void Start()
{
watcher.EnableRaisingEvents = true;
while (enabled)
{
Thread.Sleep(1);
}
}
public void Stop()
{
watcher.EnableRaisingEvents = false;
enabled = false;
}
}
Функция сохранения из программы-парсер
internal static void save<T>(T input, int i)
{
string nameFile = "f" + i.ToString() + ".json";
DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer(typeof(T));
FileStream setlock = new FileStream(i.ToString() + ".locker", FileMode.OpenOrCreate);
using (FileStream f = new FileStream(nameFile,FileMode.Create))
{
jsonFormatter.WriteObject(f, input);
}
setlock.Close();
File.Delete(i.ToString() + ".locker");
Thread.Sleep(500);
}
connection string в appsConfig
<connectionStrings>
<add name="DbConnectionString" connectionString="data source=(localdb)\MSSQLLocalDB;Initial Catalog = DataBaseEsketit;Integrated Security=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>
class MyDbContext
public class MyDbContext : DbContext
{
public MyDbContext() : base("DbConnectionString")
{
}
public DbSet<TextPost> id_texts { get; set; }
public DbSet<LinkPost> id_links { get; set; }
public DbSet<ImgPost> id_imglinks { get; set; }
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Всем приветУ меня есть на одной линии машина и три триггера, идущих друг за другом
Не записывает текст в файл=( Подскажите, пожалуйста, что не так?
У меня есть двумерный массив случайных целых чисел, которые находятся в массиве текстбоксовЯ нашла максимум и вывела его на Label1