C # CancellationToken сохранен в локальном хранилище - PullRequest
0 голосов
/ 28 сентября 2018

Я преобразую класс CancellationToken в двоичный файл, чтобы я мог сохранить его в локальном хранилище для использования в будущем, так как поток будет непрерывным, когда я преобразую его обратно, будет ли он по-прежнему функционировать таким же образом и отменяет заданную задачу?

Сначала я запускаю Задачу с помощью инициализированного токена, затем сохраняю его в БД с помощью функции ObjectToBinary.Приведенный ниже код показывает, как я пытаюсь отменить токен.

Если это невозможно, у кого-нибудь есть альтернативное решение моей проблемы?

    public static async Task StopAccountRunning(int fid)
    {
        using (gg db = new gg())
        {
            var acc = db.FInfos.FirstOrDefault(account => account.Fid == fid);
            var token = BinaryToObject<CancellationToken>(acc.ProcessCancellationToken, true);
            var tokenSrc = BinaryToObject<CancellationTokenSource>(acc.ProcessCancellationSource);

            if(token.CanBeCanceled)
            {
                tokenSrc.Cancel();
            }
            acc.isAccountRunning = 0;

            await db.SaveChangesAsync();
        }
    }

    public static T BinaryToObject<T>(byte[] data) where T : class
    {
        BinaryFormatter formatter = new BinaryFormatter();
        using (Stream s = new MemoryStream(data))
        {
            return (T)formatter.Deserialize(s);
        }
    }

    public static T BinaryToObject<T>(byte[] data, bool isStruct) where T : struct
    {
        BinaryFormatter formatter = new BinaryFormatter();
        using (Stream s = new MemoryStream(data))
        {
            return (T)formatter.Deserialize(s);
        }
    }

    public async static Task<byte[]> ObjectToBinary<T>(T data)
    {
        byte[] bytes;
        BinaryFormatter formatter = new BinaryFormatter();
        using (MemoryStream s = new MemoryStream())
        {
            formatter.Serialize(s, data);
            bytes = s.ToArray();
        }
        return bytes;
    }
...