C# 如何将回调字符串用于mainform
我有一个用c写的方法C# 如何将回调字符串用于mainform,c#,.net,C#,.net,我有一个用c写的方法 class TorrentDownload { private readonly Thread _getstateThread; public Sohadownload() { _getstateThread = new Thread(GetState); _getstateThread.Start(); } TorrentHandle handle=null;
class TorrentDownload
{
private readonly Thread _getstateThread;
public Sohadownload() {
_getstateThread = new Thread(GetState);
_getstateThread.Start();
}
TorrentHandle handle=null;
public void Start(AddTorrentParams param)
{
var _session = new Session();
if (_session == null) throw new ArgumentNullException("sesion");
_session.ListenOn(6881, 6889);
handle = _session.AddTorrent(param);
}
public void GetState(){
while (true)
{
if (handle == null)
{
Thread.Sleep(1000);
continue;
}
var status = handle.GetStatus();
if (status.IsSeeding)
{
break;
}
string _state = status.State.ToString();
double _up = status.UploadRate;
double _down = status.DownloadRate;
double _process = status.Progress;
Thread.Sleep(1000);
//Console.WriteLine("State {0} Process {1}", _state, _process);
}
}
}
现在在主程序中,我只想调用_state中的值,_up,_dơn,_进程变量来显示在Console.Writeline中
我正在尝试使用委托,但它不起作用
请帮助我,谢谢。根据您的要求,这里有一个想法 构造一个将管理状态并公开属性的类,以使您能够访问变量值 您可以从主函数调用GetState,然后访问_state、_up、_down、_process的值 如果需要,可以将属性和方法以及类设置为静态,但下面是示例代码:
public class ManageStatus
{
private string _state;
private double _up,_down,_process;
public string State
{
get{ return _state;}
set{ _state=value;}
}
public string State
{
get{ return _state;}
set{ _state=value;}
}
public double Up
{
get{ return _up;}
set{ _up=value;}
}
public double Down
{
get{ return _down;}
set{ _down=value;}
}
public double Process
{
get{ return _process;}
set{ _process=value;}
}
public void GetState()
{
while (true)
{
if (handle == null)
{
Thread.Sleep(1000);
continue;
}
var status = handle.GetStatus();
if (status.IsSeeding)
{
break;
}
_state = status.State.ToString();
_up = status.UploadRate;
_down = status.DownloadRate;
_process = status.Progress;
Thread.Sleep(1000);
}
}
}
在主代码中,您可以这样做
public static void Main()
{
var status=new ManageStatus();
status.GetState();
Console.Writline("State:{0}",status.State);
Console.Writline("Up:{0}",status.Up);
Console.Writline("Down:{0}",status.Down);
Console.Writline("Process:{0}",status.Process);
}
希望这将有助于您您可以在GetState中而不是在Main中打印该行:
除了我的另一个答案之外,您还可以修改GetState并将循环移动到Main: 当然,这个Main没有太多功能,在GetState返回之前会被阻塞,但是考虑到我们对您的程序不太了解,我认为它是一个不错的例子
我还假设handle.GetStatus不返回null。这看起来像轮询。你必须更加具体和明确。到底是什么不起作用?代表的电话是什么?在您的帖子中看不到任何代理,请使用正确的标记:winforms、threading等…感谢您的帮助。我尝试使用委托,它完成了。谢谢回复。我的目的是想将while循环中变量的值用于CommanLineHanks中显示的另一种方法。为了帮助我,我尝试了您的方法和示例代码。但我不工作。在主程序控制台WriteLine中,不打印任何内容。我在没有WHILE循环的情况下尝试您的方法,它工作正常。但我的程序需要在WHILE循环中运行才能下载数据,所以如何才能解决这个问题呢?非常感谢。这是我的全部代码。如果我把conssol.WriteLine放到While循环中,它就完成了。但我想知道如何在While循环中随时使用变量值的其他方法或函数
public void GetState()
{
while (true)
{
if (handle == null)
{
Thread.Sleep(1000);
continue;
}
var status = handle.GetStatus();
if (status.IsSeeding)
{
break;
}
Console.WriteLine("State: {0}, Up: {1}, Down: {2}, Process: {3}",
status.State.ToString(),
status.UploadRate,
status.DownloadRate,
status.Progress);
Thread.Sleep(1000);
}
}
// N.B: I don't know where you get handle from,
// I'll just adapt the code you've posted for simplicity
public WhateverTypeStatusIs GetState()
{
if (handle == null)
{
Thread.Sleep(1000);
continue;
}
var status = handle.GetStatus();
if (status.IsSeeding)
{
break;
}
return status;
}
public static void Main()
{
while (true)
{
var status = GetState();
if (status.IsSeeding)
{
break;
}
Console.WriteLine("State: {0}, Up: {1}, Down: {2}, Process: {3}",
status.State.ToString(),
status.UploadRate,
status.DownloadRate,
status.Progress);
Thread.Sleep(1000);
}
}