使用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
相关产品推荐
相关产品推荐

