我需要一种具有以下签名的有效方法:
public byte SetBits(byte oldValue, byte newValue, int startBit, int bitCount)
Run Code Online (Sandbox Code Playgroud)
它返回oldValue,只有从其startbit位开始到其startbit + bitcount位(从零开始)的位,才被替换bitcount为newValue
例如,如果:
oldValue = 11101101newValue = 10000011startBit = 1bitCount = 2那么结果将是:11101111(分段10中oldValue被替换为对应11于段newValue)
我想在容器中列出blob.对于桌面应用程序,Azure Storage SDK提供以下方法:
CloudBlobContainer container = blobClient.GetContainerReference("myBlob");
container.ListBlobs();
Run Code Online (Sandbox Code Playgroud)
但是,使用WinRT库时,该方法不存在(可能是由于其阻塞性质).我应该用什么呢?
在GUI应用程序中保存和加载用户/应用程序设置的常用方法如下所示:
private void FormMain_Load(object sender, EventArgs e)
{
m_foo = Properties.Settings.Default.Foo;
}
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
Properties.Settings.Default.Save();
}
Run Code Online (Sandbox Code Playgroud)
乍一看,这看起来很合理.但是,一旦你考虑了保存和(隐式)加载操作(即磁盘I/O)中实际发生的事情,它就显得有些怀疑了.它是否违背了一般避免可能长时间运行的原则,特别是GUI线程上的I/O?
我意识到在绝大多数情况下我们都在谈论位于本地硬盘驱动器上的非常小的文件,但我可以想出如果我真的想要操作需要一些时间来完成操作的情况(磁盘被放到睡眠,磁盘处于压力之下,磁盘实际上是网络存储等.
此外,我不清楚我应该怎么做.启动很容易处理,在设置异步加载时禁用GUI.但是关闭事件怎么样?当然,我可以取消事件,异步保存,然后自己关闭它,但它有点乱,因为我需要处理用户在我保存之前再次关闭它的情况(所以我没有启动另一个在保存等中间保存或退出).而且我不确定它甚至可以在其他框架中完成(至少很简单),比如GTK#,其中OnDeleteEvent通常在为时已晚时使用.我想我可以触发前台线程并将其保存在那里,但是然后用户可能会认为应用程序已关闭并在实际保存设置之前再次运行它(并且无论如何都可能存在其他多个实例的后果).
我应该担心这种情况还是我在思考它?
灵感来自我自己在多线程Winforms应用程序方面的经验,以及诸如此类的问题
我想出了一个非常简单的模式,我想验证它的健全性.
基本上我正在创建(并在整个应用程序的生命周期内运行)BGW,其唯一目的是同步调用请求.考虑:
public MainForm()
{
InitializeComponent();
InitInvocationSyncWorker();
}
private void InitInvocationSyncWorker()
{
InvocationSync_Worker.RunWorkerAsync();
}
private void InvocationSync_Worker_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(Timeout.Infinite);
}
void InvokeViaSyncWorker(Action guiAction)
{
InvocationSync_Worker.ReportProgress(0, guiAction);
}
private void InvocationSync_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (IsDisposed) return; //we're in the GUI thread now, so no race condition right?
var action = (Action) e.UserState;
action();
}
public void SomeMethodCalledFromAnyThread() //Sample usage
{
InvokeViaSyncWorker(() => MyTextBox.Text = "Hello from another thread!"));
}
Run Code Online (Sandbox Code Playgroud)
当然,这不是最经济的方法(让线程保持活力),但如果它有效并且我没有错过任何东西,那肯定是我见过的最简单的.
反馈非常感谢!
我正在开发一个程序,我需要从不同的线程激活一个计时器.我已经将代码缩短到下面这个例子.
static class Program
{
public static System.Windows.Forms.Timer TimerVideo = new System.Windows.Forms.Timer();
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
TimerVideo.Interval = 1000;
TimerVideo.Tick += new EventHandler(TimerVideo_Tick);
new Thread(() =>
{
test RunTimer = new test();
RunTimer.StartTimer();
}).Start();
Application.Run();
}
private static void TimerVideo_Tick(object sender, EventArgs e)
{
Console.WriteLine("Running");
}
}
class test
{
public void StartTimer()
{
Program.TimerVideo.Start();
}
}
Run Code Online (Sandbox Code Playgroud)
即使我必须在课堂上对计时器进行编码对我来说没问题,但我确实尝试过,但它也没有用,即计时器没有触发,也没有打印到控制台.