0

Либо зависает поток, либо пишет, что доступ к этому файлу заблокирован другим потоком. Хотя этого быть не может, т.к я использую using

Там проектик не большой, который я постоянно использую для разных парсингов сайта. Поэтому код может быть грязноватый.

Можете сами посмотреть, просто создав папку Work на диске C

https://github.com/gokor8/Portak/tree/master

Я знаю, что бесполезно закрывать поток в using но сделал на всякий случай, для проверки.

Ошибку выдает в классе HttpClient в методах Download.

Вот так это выглядит, когда он виснет введите сюда описание изображения

Сама ошибка: введите сюда описание изображения

Класс в котором ошибка

public static class HttpClass
    {
        public static readonly string FirstPathLink;
        static int NumberImage = 0;
        public static readonly string SiteName;
    public static CookieContainer CookieContainer;
    private static HttpClientHandler handler;
    public static HttpClient Client;

    private static IConfiguration config;
    public static IBrowsingContext Context;

    static HttpClass()
    {
        CookieContainer = new CookieContainer();
        handler = new HttpClientHandler() { CookieContainer = CookieContainer };
        Client = new HttpClient(handler)
        {
            Timeout = TimeSpan.FromMinutes(3),
            BaseAddress = new Uri("https://www.arrex.it/en/")
        };

        config = Configuration.Default;
        Context = BrowsingContext.New(config); //Client.Timeout = TimeSpan.FromMinutes(30);

        Client.DefaultRequestHeaders.Add("User-Agent", "Calam");
        SiteName = Cutter.Tram(Client.BaseAddress.Host.Replace(".", "").Replace(",", "") + 1);
        FirstPathLink = "https://" + Client.BaseAddress.Host + "/";
    }

    public static async Task<string> Download(string link)
    {
        string image = link;
        string konec1 = image.Substring(image.LastIndexOf("."), image.Length - image.LastIndexOf("."));

        if (!image.Contains("http"))
            image = FirstPathLink + image;

        Directory.CreateDirectory($@"C:\Work\{SiteName}\" + ExcelContainer.NA);

        string gg = "";

        var sourceStream = await Client.GetStreamAsync(new Uri(image));
        using (var targetStream = File.Create($@"C:\Work\{SiteName}\" + ExcelContainer.NA + @"\" + NumberImage + konec1))
        {
            await sourceStream.CopyToAsync(targetStream);
        }

        gg = $"/upload/staff/upload/staff/{SiteName}/" + ExcelContainer.NA + "/" + NumberImage + konec1 + ";\r\n";
        NumberImage++;
        return gg;
    }

    public static async Task<string> Download(string link, string konec1)
    {
        string image = link;

        if (!image.Contains("http"))
            image = FirstPathLink + image;

        Directory.CreateDirectory($@"C:\Work\{SiteName}\" + ExcelContainer.NA);

        string gg = "";

        var sourceStream = await Client.GetStreamAsync(new Uri(image));
        using (var targetStream = File.Create($@"C:\Work\{SiteName}\" + ExcelContainer.NA + @"\" + NumberImage + konec1))
        {
            await sourceStream.CopyToAsync(targetStream);
        }

        gg = $"/upload/staff/upload/staff/{SiteName}/" + ExcelContainer.NA + "/" + NumberImage + konec1 + ";\r\n";
        NumberImage++;
        return gg;
    }
}

  • я походил по репозиторию,а можно добавить, в каком именно файле и методе выдаётся ошибка? чтобы на него глазами посмотреть, прежде чем делать git clone – S.H. Nov 10 '21 at 22:26
  • Ошибку выдает в классе HttpClient в методах Download.var sourceStream = await Client.GetStreamAsync(new Uri(image)); using (var targetStream = File.Create($@"C:\Work\{SiteName}\" + ExcelContainer.NA + @"\" + NumberImage + konec1)) { await sourceStream.CopyToAsync(targetStream); targetStream.Close(); } – Gorge Flow Nov 10 '21 at 22:32
  • Ну у меня сразу было подозрение, что без экселя там не обошлось, как только увидел using ExcelLibrary.SpreadSheet. Я ПОДООЗРЕВАЮ, что у Вас в памяти висит эксель и файл в нём открыт. А программа пытается этот файл модифицировать. Но, емлу Вам не трудно - дайте полный путь к ФАЙЛУ проекта, в котором происходит ошибка? – S.H. Nov 10 '21 at 22:34
  • Думаете он потоку передачи в файл тоже мешает? – Gorge Flow Nov 10 '21 at 22:41
  • Хм, справедливое замечание! просто увидел Excel в тексте эксепшена. А как насчет ссылки на кокретный файли и метод в прооекте, где возникает ошибка? – S.H. Nov 10 '21 at 22:42
  • Я посмотрел еще раз. Исключение вызывается именно в https://github.com/gokor8/Portak/blob/master/Margaroli/Http/HttpClass.cs 77 строке – Gorge Flow Nov 10 '21 at 22:43
  • да, теперь вижу. Хм. надо подумать! – S.H. Nov 10 '21 at 22:44
  • 2
    Весь необходимый код должен быть в вопросе! В каком методе возникает исключение, тот и покажите. Только ради всего святого, текстом, а не скриншотом! – Alexander Petrov Nov 11 '21 at 00:59
  • На кой ставить значок $ интерполяции, но не использовать её? Можно так, коротко и ясно: $@"C:\Work\{SiteName}\{ExcelContainer.NA}\{NumberImage}{konec1}" – Alexander Petrov Nov 11 '21 at 01:01
  • 2
    targetStream.Close(); не нужно делать, у вас же using - вы в курсе, как оно работает? – aepot Nov 11 '21 at 01:21
  • @AlexanderPetrov, я не могу весь код написать в вопрос, иначе тут будет каша, легче дать ссылку на код, который нужо запустить и будет ошибка – Gorge Flow Nov 11 '21 at 06:52
  • @aepot я знаю что не нужен, но я поставил его для проверки, потому что очень странно, что поток открыт в другом приложении, как мне программа пишет в ошибке – Gorge Flow Nov 11 '21 at 06:54
  • @GorgeFlow если пишет, значит открыт. Но зачем добавлять закрытие для и так закрываемого нормально потока, если проблема не в закрытии, а в открытии? Добавьте логирование, вероятно вы одновременно пытаетесь писать в один и тот же файл из нескольких потоков. Ставьте точки останова, отлаживайте. И еще я советую вам изучить очень полезный метод Path.Combine и за счет него избавиться от этой каши с конкатенацией строк для путей. – aepot Nov 11 '21 at 07:03
  • Здесь по сути нет явной проблемы в коде, вас спасет только отладка. От себя могу только посоветовать заглянуть в этот и этот примеры, вдруг что полезное для себя найдете. – aepot Nov 11 '21 at 07:07
  • Я вижу в коде вызовы метода HttpClass.Download без await. Статическое поле NumberImage, которое используется для имени файла, инкрементируется ++ без всяких блокировок. Возможно, в результате этого имя файла в разных тасках оказывается одинаковым. – Alexander Petrov Nov 11 '21 at 07:08
  • Да, банально не хватает await'ов (в Lavabi.cs). NumberImage не при делах. / Код я не запускал. Просто глянул на гитхабе. – Alexander Petrov Nov 11 '21 at 07:18
  • 1
    Все пофиксил, спасибо за помощь – Gorge Flow Nov 11 '21 at 08:12

0 Answers0