You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TLSharp获取文件遇LIMIT_INVALID内存异常,求可用示例

我之前也碰到过这个LIMIT_INVALID Memory Exception的问题,大概率是因为你直接用Wait()阻塞异步调用,或者一次性把大文件加载到内存里导致的。下面给你一个可运行的完整示例,全程用异步模式,还能避免内存溢出:

解决TLSharp获取文件时的内存异常问题
using System;
using System.IO;
using System.Threading.Tasks;
using TLSharp;
using TLSharp.Core;
using TLSharp.Core.Auth;
using TLSharp.Core.MTProto;

class TelegramFileDownloader
{
    private static TelegramClient _client;
    // 替换成你自己的API信息,从Telegram开发者平台获取
    private const int ApiId = 123456; 
    private const string ApiHash = "your_api_hash_here"; 

    static async Task Main(string[] args)
    {
        // 初始化客户端
        _client = new TelegramClient(ApiId, ApiHash);
        await _client.ConnectAsync();

        // 处理登录流程(如果未授权)
        if (!_client.IsUserAuthorized())
        {
            var userPhone = "+1234567890"; // 替换成你的手机号
            var authHash = await _client.SendCodeRequestAsync(userPhone);
            Console.Write("输入收到的验证码: ");
            var code = Console.ReadLine();
            await _client.MakeAuthAsync(userPhone, authHash, code);
        }

        // 模拟获取目标消息(你可以替换成自己的消息获取逻辑)
        var dialogs = await _client.GetUserDialogsAsync();
        var targetDialog = dialogs.Dialogs[0]; // 取第一个对话,按需修改
        var messages = await _client.GetHistoryAsync(targetDialog.Peer, limit: 10);
        var targetMsg = messages.Messages[0]; // 取第一条包含文件的消息,按需修改

        // 下载文件逻辑
        if (targetMsg.Media is TLMessageMediaDocument mediaFile)
        {
            var doc = mediaFile.Document as TLDocument;
            if (doc != null)
            {
                await DownloadFileToLocal(doc, @"C:\Downloads\telegram_file.ext"); // 替换成你的保存路径
                Console.WriteLine("文件下载完成!");
            }
        }

        await _client.DisconnectAsync();
    }

    private static async Task DownloadFileToLocal(TLDocument doc, string savePath)
    {
        var fileLocation = new TLInputDocumentFileLocation
        {
            Id = doc.Id,
            AccessHash = doc.AccessHash,
            Version = doc.Version
        };

        // 用流直接写入文件,避免一次性加载到内存
        using (var localFileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write))
        {
            var telegramFileStream = await _client.GetFileStreamAsync(fileLocation, doc.Size);
            await telegramFileStream.CopyToAsync(localFileStream);
        }
    }
}

几个关键避坑点:

  • 别再用Wait()阻塞异步方法了!全程用await,不然容易引发线程死锁和内存异常,这是很多人踩过的坑。
  • 用GetFileStreamAsync替代GetFile:GetFile会把整个文件加载到内存中,大文件直接触发内存限制;GetFileStreamAsync返回流,直接写入本地文件,内存占用极低。
  • 用using包裹流对象,确保资源自动释放,避免内存泄漏。
  • 记得把代码里的API ID、API Hash、手机号、保存路径都换成你自己的信息!

如果还是有问题,可以检查下文件是否过大(TLSharp的GetFileStreamAsync已经处理了分块下载,但极端大文件可能需要额外处理),或者客户端连接是否稳定。

内容的提问来源于stack exchange,提问作者prishelets

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:38:00